你是否因为书写Linux一键脚本时有些脚本无法使用一行命令完成(如SSH输入密码),那Expect将会帮助你自动化完成这些交互操作
简单原理
比如输入如下ssh命令后会要求我们输入yes/no,以及ssh密码
ssh -l root 192.168.1.1
我们参考教程中
#判断上次输出结果里是否包含“password:”的字符串,如果有则立即返回,否则就等待一段时间(timeout)后返回
expect "password:"
#发送内容ispass(密码、命令等)
send "ispass\r"
得出命令可以写成如下(自动登录ssh执行命令)
#!/usr/bin/expect -f
set ip [lindex $argv 0 ] # 接收第1个参数,作为IP
set username [lindex $argv 1 ] # 接收第2个参数,作为username
set mypassword [lindex $argv 2 ] # 接收第3个参数,作为密码
set timeout 10 # 设置超时时间
spawn ssh $username@$ip # 发送ssh请求
expect { # 返回信息匹配
"*yes/no" { send "yes\r"; exp_continue} # 第一次ssh连接会提示yes/no,继续
"*password:" { send "$mypassword\r" } # 出现密码提示,发送密码
}
interact # 交互模式,用户会停留在远程服务器上面
一些其他参考选项
启用选项
-c:执行脚本前先执行的命令,可多次使用。
-d:debug模式,可以在运行时输出一些诊断信息,与在脚本开始处使用exp_internal 1相似。
-D:启用交换调式器,可设一整数参数。
-f:从文件读取命令,仅用于使用#!时。如果文件名为"-",则从stdin读取(使用"./-"从文件名为-的文件读取)。
-i:交互式输入命令,使用"exit"或"EOF"退出输入状态。
--:标示选项结束(如果你需要传递与expect选项相似的参数给脚本时),可放到#!行:#!/usr/bin/expect --。
-v:显示expect版本信息。
Comments NOTHING