Ubuntu expect怎么用?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ubuntu expect怎么用?相关的知识,希望对你有一定的参考价值。

这是一个expect脚本
#!/usr/bin/expect -f
set password 几百个字符
expect
"n/s/q>" send "n\r"; exp_continue
"result>" send "$password\r"; exp_continue
"y/e/d>" send "y\r"; exp_continue

以上脚本中‘几百个字符’是会变化的,但我不想每次变化都要打开脚本修改它,这样太麻烦,怎么在执行的时候创建新一个命令行来输入‘几百个字符’然后后回车修改脚本相应内容;
我用过interact参数,但是用这个参数交还控制权并输入‘几百个字符’后不知道怎么把控制权交回expect继续执行分支匹配

1) 获取命令行参数,例如通过./abc.exp a1 a2执行expect脚本
set 变量名1 [lindex $argv 0] 获取第1个参数a1
set 变量名2 [lindex $argv 1] 获取第2个参数a2
2)函数中使用外部变量
例如在函数外部定义了变量va: set va "", 现在现在某个函数中使用,需要通过全局范围限定符进行引用,即$::va,如果进行变量修改,可以使用 set ::va xxx
3) 在expect中执行shell语句
例如:
exec sh -c
if [ -f "$HOME/.ssh/known_hosts" ]
then
>$HOME/.ssh/known_hosts
fi

4) 获取spawn id
例如:
spawn ssh -l $::LAB_USER $IP
set MY_SPAWN_ID $spawn_id
5) expect以及send指定spawn id
如果只是简单的一个spawn远端连接,随后进行expect/send语句,无需指定spawn id, 有时比较复杂,比如有多个spawn id,那么需要使用 -i 指明具体哪一个,例如:
expect
-i $::MY_SPAWN_ID
"/home/xxx:"
send -i $::MY_SPAWN_ID "YOUR SHELL CMD HERE\r";

timeout puts "timeout for xxx"; exit

6) 获取send命令执行结果
可以通过$expect_out(buffer) 获取上一次send命令以后的远端输出结果,此变量必须在send以后的下一个expect 语句中使用才有效。上一个send最好也是在某个expect 中执行,否则可能不起作用。例如:
expect
"#"
send "ps -ef|grep my_app|grep -v grep\r"; (grep -v表示取反,去掉不想要的信息,因为会有一条多余的grep命令在grep结果中显示出来)

timeout puts "timeout for xxx"; exit

expect
"#"
puts "Got response: $expect_out(buffer)";

timeout puts "timeout for xxx"; exit

7) 清空expect_out结果
在expect 语句内部执行unset expect_out(buffer);
参考技术A 然后后回车修改脚本相应内容; 我用过interact参数,但是用这个参数交还控制权并输 参考技术B 嗯,我也不知道是什么业务啊。

以上是关于Ubuntu expect怎么用?的主要内容,如果未能解决你的问题,请参考以下文章

Linux expect 详解

如何在bash shell脚本中使用expect

linux expect安装后使用有问题,expect正常,但是send和spawn提示找不到命令

小型自动化运维--expect脚本V2版

Expect实现批量主机公钥推送

shell之expect应答语句(用shell脚本实现获取批量主机存活信息)