Использование команд bash в ожидаемом скрипте
Я пытался использовать некоторые команды bash в сценарии ожидаемого вызова перед тем, как что-то создавать, но это, похоже, не работает:
#!/usr/bin/expect
sudo ifdown usb0
sudo ifup usb0
expect "[sudo] password for stud:"
send "FirstPassword\r"
spawn ssh root@10.9.8.2
expect "root@10.9.8.2's password:"
send "SecondPassword\r"
expect eof
Я попытался запустить это с закомментированной первой частью сценария (потому что нет необходимости делать эту проверку 100% времени, просто лучше), но в этом случае я вхожу в устройство и буквально ничего не могу сделать там. Я бы хотел, чтобы ifup, введите pass, ssh, введите pass и scope для этой оболочки.
2 ответа
Нету. вы не можете ожидать запуска команд bash в ожидаемом интерпретаторе, так же, как вы не можете запускать команды perl в интерпретаторе python - это разные языки. Если вы хотите запустить некоторые команды bash, требующие взаимодействия с пользователем (sudo), то вам нужно создать 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 root@10.9.8.2\r"
expect "root@10.9.8.2's password:"
send "SecondPassword\r"
expect eof
Если команда, которую вы хотите запустить внутри
expect
script должен генерировать некоторый вывод, который вы хотите использовать внутри скрипта, а затем рассмотрите возможность запуска вашей команды вне скрипта, а затем передать любое значение, которое вам нужно, в качестве параметра.
Пример для
openvpn
который требует токена OTP в качестве параметра:
autovpn.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')