Ожидаемый сценарий не работает с несколькими запросами пароля

#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:

  1. поместите несколько шаблонов в одну и ту же команду ожидания
  2. используйте специальный 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. Идеальный Гленн!! Большое вам спасибо за вашу помощь!!