#shell #perl #expect
#ожидать
Вопрос:
Я пытаюсь выполнить сценарий perl для подключения к хостам Linux, сгенерировать привязку, а затем мне нужно отправить эту привязку на мой локальный сервер. Поэтому я должен ввести пароль 2 раза: 1 — для входа на серверы и 2 — для SCP ранее созданного файла. Проблема в том, что мой ожидаемый сценарий работает только для первого пароля, у кого-нибудь есть идеи?
[linuxserver]$ ./mul.sh
spawn perl perlscript.pl
Cleaning up /tmp/logs
Getting logs from server 9.x.x.x using snap
Password: <------ THIS ITERATION WORKS FINE WITH EXPECT
Password: <------ THE 2nd ITERATION DOES NOT WORK AND I HAVE TO ADD THE PASSWORD MANUALLY
[linuxserver]$
export PASSWORD='mypassword'
/usr/bin/expect -c '
spawn perl perlscript.pl
expect {
-nocase "*assword*" {
send "$env(PASSWORD)r"
exp_continue
}
expect -c "
expect "*assword*"
send $env(PASSWORD)r
interact"
}
interact
'
Комментарии:
1. Ваш отступ не отражает организацию отдельного
expect
оператора в этом. Обратите пристальное внимание на фигурные скобки и двойные кавычки.2. Взгляните на мой sexpect (ожидание для оболочек) , который вы можете использовать для написания ожидаемых сценариев только с кодом оболочки .
Ответ №1:
Во-первых, используйте heredoc в кавычках при размещении сценария ожидания внутри сценария bash, это значительно сокращает количество кавычек.
Кажется, вам нужно ввести пароли, а затем просто дождаться завершения работы программы perl:
- поместите несколько шаблонов в одну и ту же команду ожидания
- используйте специальный
eof
шаблон, чтобы ожидать завершения созданной программы.
/usr/bin/expect <<'END_EXPECT'
set timeout -1
spawn perl perlscript.pl
expect {
-nocase "*assword*" {
send "$env(PASSWORD)r"
exp_continue
}
eof
}
END_EXPECT
Комментарии:
1. Идеальный Гленн!! Большое вам спасибо за вашу помощь!!