在 Expect 脚本中使用 Bash 命令

在 Expect 脚本中使用 Bash 命令

在生成任何内容之前,我尝试在期望脚本中使用一些 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')

相关内容