Использование команд 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

Если команда, которую вы хотите запустить внутри expectscript должен генерировать некоторый вывод, который вы хотите использовать внутри скрипта, а затем рассмотрите возможность запуска вашей команды вне скрипта, а затем передать любое значение, которое вам нужно, в качестве параметра.

Пример для 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')
Другие вопросы по тегам