Linux 下 expect 脚本语言中交互处理常用命令

摘要:
/Usr/bin/expect告诉操作系统脚本中的代码使用哪个shell。这告诉操作系统使用expect作为shell来执行脚本。Spawn是一个内部expect命令,只能在进入expect环境后执行。如果不在默认shell中安装expect或直接执行它,则无法找到派生命令。此命令用于确定交互中的最后一个输出结果是否包含一些字符串。“要确定交互式输出是否包含”密码:

Linux 下 expect 脚本语言中交互处理常用命令

1. #!/usr/bin/expect
告诉操作系统脚本里的代码使用那一个 shell 来执行。这里的 expect 其实和 Linux 下的 bash、windows 下的 cmd 是一类东西。
注意:这一行需要在脚本的第一行,从而告知操作系统采用 expect 作为 shell 执行脚本。
注意:当使用 #!/usr/bin/expect -d 时,expect 脚本将运行在调试模式,届时脚本执行的全过程将被展示出来。
2. set timeout
设置超时时间,计时单位是:秒,timeout -1 为永不超时。
例如:set timeout 30 为设置超时时间为 30 秒。则当某个 expect 判断未能成功匹配的 30 秒后,将跳过该 expect 判断,执行后续内容。
3.spawn 
它主要的功能是给运行进程加个壳,用来传递交互指令
spawn 是进入 expect 环境后才可以执行的 expect 内部命令,如果没有装 expect 或者直接在默认的 shell 下执行是找不到 spawn 命令的。所以不要用 “which spawn“ 之类的命令去找 spawn 命令。好比在 windows 里的 dir 就是一个内部命令,这个命令由 shell 自带,你无法找到一个 dir.com 或 dir.exe 的可执行文件。
例如:spawn ssh -l username 192.168.1.1 将为 ssh -l username 192.168.1.1 加壳,届时该命令的交互指令将可以被处理。
4.expect
这里的 expect 是 expect 的一个内部命令,需要在 expect 环境中执行。该命令用于判断交互中上次输出的结果里是否包含某些字符串,如果有则立即返回。否则如果有设置超时时间,则等待超时时长后返回。
例如:expect "password:" 为判别交互输出中是否包含 "password:" 字符串。
5.send
该命令用于执行交互动作,与手工输入动作等效。
注意: 命令字符串结尾别忘记加上 " "(换行符),如果出现异常等待的状态可以核查一下。
例如:send "ispass " 为交互中输入 "is pass "。
6.interact
执行完成后保持交互状态,把控制权交给控制台,这个时候便可以手工操作。如果没有该命令,命令完成后即退出。
7.$argv 参数数组
expect 脚本可以接受从 bash 传递过来的参数。
其中通过 [lindex $argv n] 可以获得第 n 个参数的值,通过 [lrange $argv a b] 可以获取 a-b 的参数值。
例如:编写 test.sh 脚本,内容如下。
#!/usr/bin/expect
set timeout 2 
set username [lindex $argv 0] 
set password [lindex $argv 1] 
set hostname [lindex $argv 2] 
spawn /usr/bin/ssh $username@$hostname
expect {
"yes/no"
{send "yes "; exp_continue;}
"Password:"
{send "$password ";}
}
expect eof
则通过调用脚本 ./test.sh oracle password 192.168.87.1 可以使用 oracle 用户以密码 password 登录 192.168.87.1,脚本最后自动登出
8.exp_continue
exp_continue 附加于某个 expect 判断项之后,可以使该项被匹配后,还能继续匹配该 expect 判断语句内的其他项。exp_continue 类似于控制语句中的 continue 语句。
例如:下例将判断交互输出中是否存在 yes/no 或 *assword。如果匹配 yes/no 则输出 yes 并再次执行判断;如果匹配 *assword 则输出 123abc 并结束该段 expect 语句。
expect {
    "yes/no" {send "yes "; exp_continue;}
    "*assword" {set timeout 300; send "123abc ";}
}
注意:exp_continue [-continue_timer] 默认情况下 exp_continue 会重高超时时钟,-continue_timer 选项会阻止时钟重新计数(连续计数)。
 

免责声明:文章转载自《Linux 下 expect 脚本语言中交互处理常用命令》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇informatica 参数文件配置matlab怎么同时显示imshow 两幅图片下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Electron-Node安全性问题之一

上次开会项目开会提到了使用electron安全性的问题: 是否要禁用Node.js集成?是目前所要考虑的问题。 跨站脚本(XSS)攻击很常见,攻击者跳过渲染进程并在用户电脑上执行恶意代码,危害是非常大的。禁用Node.js集成有助于防止XSS攻击升级为“远程代码执行”(RCE)攻击。 怎么解决Node.js集成的问题? 当禁用Node.js集成时,你可以暴...

es6模块化导入导出

模块化指的就是将一个大程序拆分成若干个互相依赖的小文件,然后在用简单的方法拼装起来。 在 ES6 之前,JS没有模块化系统,社区制定了一些模块加载方案 最主要的有 CommonJS(Asynchronous module definition) 和 AMD(common module definition) 两种。前者用于服务器,后者用于浏览器 /* Co...

Fortify漏洞修复总结

  1.代码注入 1.1 命令注入 命令注入是指应用程序执行命令的字符串或字符串的一部分来源于不可信赖的数据源,程序没有对这些不可信赖的数据进行验证、过滤,导致程序执行恶意命令的一种攻击方式。 问题代码: $dir = $_POST['dir'] exec("cmd.exe /c dir" + $dir); 修复方案:(1)程序对非受信的用户输入数据...

Mac系统安装Aircrack-ng破解附近wifi密码(1)

  第一步, 安装macport, 安装Xcode   安装macport macport 是一个工具 管理软件包的一个工具, 我们也可以通过别的方式安装Aircrack-ng, 但是通过macport安装Aircrack-ng的速度是最快的, (Mac系统要求安装Xcode, 可以参考macport的首页)   macport没安装的话通过:https:...

Unity 3D 如何修改新建脚本中的 C# 默认创建的 Script 脚本格式

  首先在Unity的安装路径下找到 Unity5EditorDataResourcesScriptTemplates路径的(81-C# Script-NewBehaviourScript.cs.txt)的模板文件,根据你的需要,把内容修改成自己要想的默认格式就好....

python 通过pip freeze、dowload打离线包及自动安装【适用于保密的离线环境】

python的pip是其包管理工具,相当方便好用。本文只介绍pip 如何通过其freeze命令打离线包,及其离线包的安装脚本。这个知识点,特别适用于不适合连通互联网,设备需要物理隔绝,保密要求严格的客户环境。 环境 操作系统: Centos 7.7 python 版本: 2.7 客户网络环境: 离线 研发网络环境:联网 pip 安装 (1)下载rpm包...