在生成任何内容之前,我尝试在期望脚本中使用一些 bash 命令,但这似乎不起作用:
#!/usr/bin/expect
sudo ifdown usb0
sudo ifup usb0
expect "[sudo] password for stud:"
send "FirstPassword\r"
spawn ssh [email protected]
expect "[email protected]'s password:"
send "SecondPassword\r"
expect eof
我尝试过在注释掉脚本第一部分的情况下运行它(因为没有必要 100% 地进行此检查,只是更好),但在这种情况下我进入了设备,但实际上无法在那里执行任何操作。我想 ifdown ifup,输入 pass,ssh,输入 pass,然后进入该 shell。
答案1
不。您不能期望在 expect 解释器中运行 bash 命令,就像您不能在 python 解释器中运行 perl 命令一样——它们是不同的语言。如果您想运行一些需要用户交互(sudo)的 bash 命令,那么您必须生成 bash
set prompt {\$ $} ; # this is a regular expression that should match the
# *end* of you bash prompt. Alter it as required.
spawn bash
expect -re $prompt
send "sudo ifdown usb0\r"
expect {
"[sudo] password for stud:" {
send "FirstPassword\r"
exp_continue
}
-re $prompt
}
send "sudo ifup usb0\r"
expect -re $prompt
send "ssh [email protected]\r"
expect "[email protected]'s password:"
send "SecondPassword\r"
expect eof
答案2
如果您想要在脚本中运行的命令expect
应该生成一些您想要在脚本中使用输出,然后考虑运行您的命令外部脚本,然后传递您需要的任何值作为参数。
openvpn
需要 OTP 令牌作为参数的示例:
自动VPN.exp
#!/usr/bin/expect -f
set OTP_CODE [lindex $argv 0]
set timeout -1
spawn sudo openvpn --config my_vpn_profile.ovpn
expect "Enter Auth Username:"
send -- "myuser\r"
expect "Enter Auth Password:"
send -- "mysecret\r"
expect "CHALLENGE: Enter Authenticator Code"
send -- "$OTP_CODE\r"
expect_background
现在您可以运行预期脚本,并将 opt 代码作为第一个参数传递:
./autovpn.exp $(oathtool -b --totp 'my_otp_seed_ABCDEFGH')