shell脚本之expect的使用

shell编程中expect 的一般用法 是一个强大的工具,它基于Tcl语言开发,主要用于自动化交互式程序的控制。当执行脚本时遇到需要用户输入的情况(如SSH登录、密码验证或其他等待输入的命令行程序),可以使用。来模拟这些交互过程,从而实现非交互式的自动化执行。在Shell编程中, 阅读详情

参考博客:

https://blog.youkuaiyun.com/chengxuyuanyonghu/article/details/51384819

https://blog.youkuaiyun.com/taosiheng/article/details/7210986

http://blog.51cto.com/welcomeweb/1679528 

为什么需要expect?
    我们通过Shell可以实现简单的控制流功能,如:循环、判断等。但是对于需要交互的场合则必须通过人工来干预,有时候我们可能会需要实现和交互程序如telnet服务器等进行交互的功能或者在登录root用户时需要用户交互输入密码。而Expect就使用来实现自动交互的工具。

    我们通过Shell可以实现简单的控制流功能,如:循环、判断等。但是对于需要交互的场合则必须通过人工来干预,有时候我们可能会需要实现和交互程序如telnet服务器等进行交互的功能或者在登录root用户时需要用户交互输入密码。而Expect就使用来实现自动交互的工具。

    Expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预。Expect的作者Don Libes在1990年开始编写Expect时对Expect做有如下定义:Expect是一个用来实现自动交互功能的软件套件(Expect [is a] software suite for automating interactive tools)。使用它系统管理员的可以创建脚本用来实现对命令或程序提供输入,而这些命令和程序是期望从终端(terminal)得到输入,一般来说这些输入都需要手工输入进行的。 Expect则可以根据程序的提示模拟标准输入提供给程序需要的输入来实现交互程序执行。甚至可以实现实现简单的BBS聊天机器人。

expect的安装:

sudo apt install expect

expect的使用:

#!/usr/bin/expect               #expect命令路径  whereis 查看
set timeout 5                   #5秒超时
set user "[lindex $argv 0]"     #将输入的第一个参数作为user变量
set password "aoeiuv123"        #设置变量password值
spawn su - $user                #连接其他用户
expect "*密码*"                 #判断上次输出的结果中是否含有 "密码" 有就继续执行,没有就好等待5S超时退出
send "$password\r"              #输入密码
expect "root@momo*"             #检查是否有该字符串
send "df -h\r"                  #在新用户下执行命令
expect "root@momo*"             #检查是否有该字符串
send "ls -trl\r"                #在新用户下执行命令

interact
(interact  #用exact这个指令是为了把控制权交给用户,代替send "logout\r"    终端不会断开)


上面脚本另一种形式:

#!/usr/bin/expect
set user "[lindex $argv 0]"
set password "aoeiuv123"
spawn su - $user

expect {
    "*密码*" {
        send "$password\r"
        expect {
            "*root@momo*" {
                send "df -h\r"
            }
            "root@momo*" {
                send "ls -trl\r"
            }
        }
    }
}

interact


注意 : 该脚本是expect脚本 不是shell  sh file. 不能执行  可以 ./file  或者 expect file  
扩展: 可以将上面的脚本写入一个循环中,循环读取文件中的密码和IP进行批量的机器执行命令或者其他脚本。

  1. [#!/usr/bin/expect] 
  这一行告诉操作系统脚本里的代码使用那一个shell来执行。这里的expect其实和linux下的bash、windows下的cmd是一类东西。 
  注意:这一行需要在脚本的第一行。 
  2. [set timeout5] 
  基本上认识英文的都知道这是设置超时时间的,现在你只要记住他的计时单位是:秒 
  3. [spawn su - $user ] 
  spawn是进入expect环境后才可以执行的expect内部命令,如果没有装expect或者直接在默认的SHELL下执行是找不到spawn命令的。所以不要用 “which spawn“之类的命令去找spawn命令。好比windows里的dir就是一个内部命令,这个命令由shell自带,你无法找到一个dir.com 或 dir.exe 的可执行文件。 
  它主要的功能是给ssh运行进程加个壳,用来传递交互指令。 
  4. [expect "*密码*" ] 
  这里的expect也是expect的一个内部命令,有点晕吧,expect的shell命令和内部命令是一样的,但不是一个功能,习惯就好了。这个命令的意思是判断上次输出结果里是否包含“password:”的字符串,如果有则立即返回,否则就等待一段时间后返回,这里等待时长就是前面设置的30秒 
  5. [send "df -h\r"] 
  这里就是执行交互动作,与手工输入密码的动作等效。 
  温馨提示: 命令字符串结尾别忘记加上“\r”,如果出现异常等待的状态可以核查一下。 
  6. [interact] 
  执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。如果你只是登录过去执行 
  #!/usr/bin/expect #注意安装的路径,不确定 whereis expect 一下 
#!/usr/bin/expect               #expect命令路径  whereis 查看
set timeout 5                   #5秒超时
set user "[lindex $argv 0]"     #将输入的第一个参数作为user变量
set password "aoeiuv123"        #设置变量password值
spawn su - $user                #连接其他用户
expect "*密码*"                 #判断上次输出的结果中是否含有 "密码" 有就继续执行,没有就好等待5S超时退出
send "$password\r"              #输入密码
expect "root@momo*"             #检查是否有该字符串
send "df -h\r"                  #在新用户下执行命令
expect "root@momo*"             #检查是否有该字符串
send "ls -trl\r"                #在新用户下执行命令

#!/usr/bin/expect
set user "[lindex $argv 0]"
set password "aoeiuv123"
spawn su - $user

expect {
    "*密码*" {
        send "$password\r"
        expect {
            "*root@momo*" {
                send "df -h\r"
            }
            "root@momo*" {
                send "ls -trl\r"
            }
        }
    }
}

interact

#!/usr/bin/expect
set user "[lindex $argv 0]"
set password "aoeiuv123"
spawn su - $user

expect {
    "*密码*" {
        send "$password\r"
        expect {
            "*root@momo*" {
                send "df -h\r"
            }
            "root@momo*" {
                send "ls -trl\r"
            }
        }
    }
}

interact



【shell笔记】-----shell脚本使用 expect指令实现ssh自动登录 运用到虚拟机的时候,经常需要ssh root@192.168.1.1或者直接ssh 192.168.1.1,然后等待输入用户密码。这样下来,对于服务器运维每天要登录很多服务器,那么这一步骤就显得累赘。在学习网络中,用SecureCRT Application登录router/switch是很方便的,只需要将登录信息记录下来,下次即可直接登录。 在Linux中expect就是一个处理交互的指令... 阅读详情

相关推荐

Shell脚本免密登陆——Expect

一、Expect介绍: 1、建立在tcl上的一个工具; 2、用于进行自动化控制和测试; 3、解决shell脚本中交互相关的问题。 二、expect的使用: 1、判断上次输出结果中是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回; 2、只能捕捉由spawn启动的进程的输出; 3、用于接收命令执行后的输出,然后和期望的字符串匹配。 三、send的使用: 1、向进程发送字符串,用于模拟用户的输入; 2、该命令不能自动回车换行,一般要加\r(回车)或\n(换行) 四、spawn的使用: 启动进程,并

weixin_47403060的博客 830

Shell 之 免交互编程(expect用法)

Here Document 是标准输 入的一种替代品,可以帮助脚本开发人员不必使用临时文件来构建输入信息,而是直接就地 生产出一个文件并用作命令的标准输入,Here Document 可以与非交互式程序和命令一起使用。...............

weixin_71438279的博客 3249

Shell脚本中利用expect实现非交互式

expect非交互式 expect可以在脚本中完成一些交互式的操作,例如远程登录时要输入yes或者输入密码 expect是一个自动化交互套件,主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信。 expect自动交互流程: spawn启动指定进程—expect获取指定关键字—send向指定程序发送指定字符—执行完成退出. expect常用命令总结: spawn 交互程序开始后面跟命令或者指定程序 expect 获取匹配信息匹配成功

江晓龙的博客 1051

linux的shell嵌套expect,shell脚本嵌套expect脚本

#!/bin/shecho "helo"password='xxxx' ###不能在下面的expect脚本段设置成 set password xxxx否则获取不到变量,单独的expect脚本变量可以这样设置/usr/local/bin/expect <spawn scp -rp /home/test/  user@x.x.x.x:/home/testexpect {"(yes/no)?" ...

weixin_42395823的博客 1874

搞定shell脚本expect自动化交互输入密码等就是这么简单

搞定shell脚本expect自动化交互输入密码等就是这么简单

TrueDei 6682

Allegro PCB设计实战:5分钟搞定DDR信号线的Match Group等长规则设置

本文详细介绍了在Allegro PCB设计中,如何快速为DDR信号线设置Match Group等长规则。通过实战演练,解析了从理解相对传输延迟原理、在规则管理器中创建Match Group,到设置合理容差和利用动态绕线指示的全流程,帮助工程师在5分钟内高效完成高速信号时序约束,提升设计可靠性与效率。

gg901的博客 1054

shell学习之四---expect命令

expect可以实现shell实现不了的用户交互的需求。expect可以将交互写在一个脚本上,完成很多自动化的动作,比如ssh、ftp登陆等,都是需要交互需求的。expect是需要安装的,直接yum  -y install expect安装即可。 expect的四个关键命令为:spawn、expect、send、set,其中spawn是调用要执行的命令,expect是等待命令提示信息的出现也

jxdl6655的博客 5590

【嵌入式DIY实例-Arduino篇】-脉搏传感器监测脉搏率 (BPM)及可视化

在本文中,我们将使用 Arduino 和脉搏传感器来测量心率 (BPM)。 在文章中,我们将向展示如何使用脉搏传感器测量您的心率(每分钟心跳次数),并在电脑上位机通过Processing来实现心率数据可视化。同时使用LCD16×2 显示屏显示脉搏率 BPM。 该传感器易于使用和操作。 只需将手指放在传感器顶部,它就会测量心跳变化。

视觉与物联智能 834

shell 之 免交互编程(expect用法)

建立在tcl语言基础上的一个工具,常被用于进行自动化控制和测试,解决shell脚本中交互相关的问题。expect 的执行过程 1、环境安装 expect它是一个程序,所以需要进行安装,才能使用 2、基本命令 2.1 脚本解释器 expect脚本中首先引入文件,表明使用的是哪一个shell 2.2 spawn(跟踪) spawn后面通常跟一个Linux执行命令,表示开启一个会话,启动进程,并跟踪后续交互信息 2.3 expect (捕捉) 判断上次输出结果中是否包含指定的字符串,如果有则立即返回,否则就等待超

种一颗树最好的时间是十年前,其次是现在! 2490

垂类大模型 研发方向与具体方案调研

领域知识库加上通用大模型,针对通用大模型见过的知识比较少的问题,利用向量数据库等方式根据问题在领域知识库中找到相关内容,再利用通用大模型强大的summarization和qa的能力生成回复,完成本次垂直大模型研发。目前很多企业希望将大模型的能力应用到企业内部当中,但很多通用大模型只是一个预训练模型,其所能回答的知识主要来源于互联网上公开的通用知识库,对于部分垂直领域和企业内部的私有知识库的问答,给出的回答。:垂类大模型的效果与底座性能息息相关,研发垂类大模型第一步就是确定开源大模型解决方案。

风吹落叶的博客 3329

基于STM32单片机设计的红外人脸测温仪(QT上位机)

基于STM32单片机设计的红外人脸测温仪(QT上位机)是一种结合红外测温和人脸识别技术的设备,可以快速、非接触地测量人体体温并识别身份,广泛应用于人员密集场所的体温筛查和出入管理。基于STM32单片机设计的红外人脸测温仪是一种功能实用、易于使用的人脸测温设备,可以有效提高测温效率和识别准确率,广泛应用于各类人员密集场所的体温筛查和出入管理。

走向CTO的路上... 1719

Linux系统Shell脚本之expect脚本免交互

使用I/O重定向的方式将命令列表提供给交互式程序,是标准输 入的一种替代品,可以帮助脚本开发人员不必使用临时文件来构建输入信息,而是直接就地 生产出一个文件并用作命令的标准输入,Here Document 可以与非交互式程序和命令一起使用建立在tcl(tool command language)语言基础上的一个工具,常被用于进行自动化控制和测试,解决shell脚本中交互的相关问题,使用前需要安装(yum install -y expect)。

2502_90917285的博客 1000

(五)C++自制植物大战僵尸游戏LoadingScene的实现讲解

游戏启动后就会立即切换到游戏加载场景中。只有游戏资源文件加载完成后,才能进入游戏。Loadingscene类继承Cocos2d-x中的Scene父类,表明Loadingscene是一个场景类。切换到LoadingScene场景中,首先会创建该场景,会调用函数,在该函数中调用自己定义的方法实现指定功能。代码文件的位置如下图所示。

尔灵尔亿的博客 2006

Shell脚本-expect

Shell脚本-expect

m0_61787196的博客 1016

pip install mysql出现error: subprocess - exited-with-error的解决方案

本文主要介绍了pip install mysql出现error: subprocess - exited-with-error的解决方案,希望能对使用mysql的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 5万+

我在腾讯上构建了一个人人能用的机载适航知识库

当ChatGPT掀起生成式AI的浪潮时,工程师们发现了一个尴尬的现实:询问“如何编写软件合格审定计划”,AI的回答可能充满似是而非的术语,却无法精确关联FDO-178C的对应内容。现在市面上有许多的AI大模型+适航知识库的方案,之前我的文章介绍了一种本地大模型加知识库的解决方法。此外,ima知识库的容量大小可以到30GB(企鹅大气),只要管理好文件的格式,理论上是完全可以把机载适航相关的内容容纳进去的。后续会不断增加适航法规,适航规章,适航标准,适航书籍,适航相关的论文,以及网上其他一些优秀的内容。

qq_41854911的博客 1223

Linux expect脚本与shell脚本相结合

expect基础 在使用expect时,基本上都是和以下四个命令打交道: 命令 作用 说明 send 用于向进程发送字符串 命令接收一个字符串参数,并将该参数发送到进程 expect 从进程接收字符串 命令和send命令相反,expect通常用来等待一个进程的反馈,我们根据进程的反馈,再发送对应的交互命令 spawn 启动新的进程 spawn后的send和expect命令都...

chenbogger的博客 2680

SAP MM模块后续借记、后续贷记、贷方凭证简介

在SAP系统中,后续借记、后续贷记和贷方凭证是处理供应商发票、采购和付款过程中常见的财务交易。

我小时候很黑的博客 3270

Shell脚本:expect脚本免交互

(1)交互:人工发出指令控制程序的运行,程序收到人工相应指令后,做出相应的反应。(2)免交互:程序按编写好的运行方式,进行指定指令操作,在这个过程中,不需要人工操作,自动化完成。(1)建立在tcl之上的一个工具(2)用于进行自动化控制和测试(3)解决shell脚本中交互相关的问题。

Riky12的博客 3251

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

expect返回值给shell_linux-如何在shell脚本中通过命令行传递expect参数

linux-如何在shell脚本中通过命令行传递expect参数我正在外壳脚本中通过命令行在expect中传递参数我试过了#!/usr/bin/expect -fset arg1 [lindex $argv 0]spawn lockdis -pexpect "password:" {send "$arg1\r"}expect "password:" {send "$arg1\r"}expect "...

weixin_42372722的博客 1045

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

使用Shell脚本+expect脚本(切换用户以及expect库自动填充密码)

每次断电后都需要手动开启网络,很麻烦,尤其是10个8个服务器的时候,因此写一个脚本来进行操作 使用Shell脚本+expect脚本(切换用户以及expect库自动填充密码) 制作一个调用网络登陆 文件的脚本 Internet_login.sh 是用来进行登陆网络的脚本 #! /bin/bash # bash脚本的标志 /usr/bin/expect <<EOF # 这里意味着bash脚本中嵌套着expect脚本 set timeout -1

weixin_43537192的博客 1012

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【Linux】shell脚本使用scp、expect安装

shell脚本使用scp(简版) shell脚本使用scp(详版) expect安装

依旧的博客 5468

48. Shell脚本中的expect的应用

Lesson48 Shell脚本中的顺序机制(if-else)和点名机制(case) 文章目录1. if语句的定义 1. if语句的定义

qq_43687755的博客 227

将expect加入到shell脚本后 导致设置变量不生效

将expect加入到shell脚本后 set 定义的变量会失效; 解决办法 : 将变量提到expect之外定义 #!/bin/bash . /etc/profile. ~/.bash_profileipnum=`ifconfig|grep addr|grep xxxx |wc -l`if [ $ipnum -eq 0 ];then exitfitime2=`date "+%Y%m%d...

1030

shell脚本之expect免交互

目录一、expect概述二、expect基本命令2.1、expect安装2.2、expect流程命令2.3、expect内容命令2.4、expect其他命令三、expect执行方式3.1、expect语法3.2、Expect直接执行(以ssh为例)3.3、expect嵌入执行(以ssh为例)3.4、Expect脚本命令总结四、Expect实操4.1、创建用户qwer,密码qwer1234.2、SSH登录 一、expect概述 expect是建立在tcl基础上的一个工具,expect是用来进行自动化控制和

huhaiyangFIVE的博客 334
上一篇: 数据结构之队列的学习程序实例
下一篇: Windows中在命令提示符中tab补全目录或文件
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值