2016-09-19 6 views
0

я написал следующий ожидать сценарий:Использования вложенного метода икры в сценарии ожидать

/usr/bin/expect<<EOF 
set SERVER_HOSTNAME "$env(SERVER_HOSTNAME)" 

set USERNAME "$env(USERNAME)" 
set PASSWORD "$env(PASSWORD)" 

set timeout -1 

spawn ssh "[email protected]$SERVER_HOSTNAME" 
expect { 
     "Host key verification failed." { spawn ssh-keygen -R "$SERVER_HOSTNAME"; expect "known_hosts.old"; send_user "Updated host key details."; exp_continue} 
     "continue connecting (yes/no)" { send "yes\r"; expect "Permanently added"; exp_continue} 
     "assword:" { send_user "Keygen details are correctly mapped for this server\n"} 
     } 
EOF 

Здесь я хочу, что если ключ хоста сервера не может быть проверен в то время как spawing процесс «SSH», то вложенным Процесс spawn «ssh-keygen -R» должен удалить старый ключ. Затем процесс «ssh» должен попытаться подключиться снова, чтобы добавить новый ключ, соответствующий этому серверу.

Но вот, после исполнения:

send_user "Updated host key details." 

метод, ожидать процесс выхода из этого сценария.

Я знаю, что альтернативой может быть, чтобы разделить это ожидать называют в два этапа, а именно:

/usr/bin/expect<<EOF 
set SERVER_HOSTNAME "$env(SERVER_HOSTNAME)" 

set USERNAME "$env(USERNAME)" 
set PASSWORD "$env(PASSWORD)" 

set timeout -1 

spawn ssh "[email protected]$SERVER_HOSTNAME" 
expect { 
     "Host key verification failed." { spawn ssh-keygen -R "$SERVER_HOSTNAME"; expect "known_hosts.old"; send_user "Updated host key details."; exp_continue}    
     "continue connecting (yes/no)" { send "yes\r"; expect "Permanently added"; exp_continue} 
     "assword:" { send_user "Keygen details are correctly mapped for this server\n"} 
     } 


spawn ssh "[email protected]$SERVER_HOSTNAME" 
expect {   
     "continue connecting (yes/no)" { send "yes\r"; expect "Permanently added"; exp_continue} 
     "assword:" { send_user "Keygen details are correctly mapped for this server\n"} 
     } 

EOF  

Но у нас есть способ, чтобы выполнить это ожидать вызова на одном дыхании. В двух словах, я хочу знать, можем ли мы сделать вложение процесса появления?

ответ

0

Пробел проходит долгий путь к поддерживаемому коду: вам не нужно раздавить так много команд на строку.

spawn ssh "[email protected]$SERVER_HOSTNAME" 
expect { 
    "Host key verification failed." { 
     spawn ssh-keygen -R "$SERVER_HOSTNAME" 
     expect "known_hosts.old" 
     send_user "Updated host key details." 
     exp_continue 
    } 
    "continue connecting (yes/no)" { 
     send "yes\r" 
     expect "Permanently added" 
     exp_continue 
    } 
    "assword:" { 
     send_user "Keygen details are correctly mapped for this server\n" 
    } 
} 

I в этом случае, вам не нужно взаимодействовать с SSH-серийник, так что используйте exec просто называть его

"Host key verification failed." { 
     exec ssh-keygen -R "$SERVER_HOSTNAME" 
     puts "Updated host key details." 
     exp_continue 
    } 

Если вам нужно, чтобы породить что-то и взаимодействовать с ним, вам нужно знать, что существует неявная переменная, spawn_id, созданная spawn и используемая ожиданием и отправкой. Вам нужно будет сохранить spawn_id текущего процесса, прежде чем запускать какой-либо другой процесс. Например:

spawn process1 
set ids(1) $spawn_id 
expect -i $ids(1) "some pattern" 
send -i $ids(1) "some string\r" 

spawn process2 
set ids(2) $spawn_id 
expect -i $ids(2) "some pattern from process2" 
send -i $ids(2) "some string to process2\r" 
+0

Как я могу использовать exp_continue после процесса 2. Например, если я хочу, чтобы написать сценарий следующим образом: \t икру SSH "$ USERNAME @ $ SERVER_HOSTNAME" \t набор идентификаторов (1) $ spawn_id \t ожидать { \t \t \t "Host ключ проверки не удалось." {spawn ssh-keygen -R "$ SERVER_HOSTNAME"; ожидать «known_hosts.old»; send_user «Обновлены сведения о главном узле»; exp_continue -i $ ids (1)} \t \t \t «продолжить соединение (да/нет)» {spawn $ ScriptsDir/TestProcess; send -i $ ids (1) «yes \ r»; ожидать -i $ ids (1) «Постоянно добавлено»; exp_continue -i $ иды (1)} \t \t \t "assword:" {send_user "детали Keygen правильно отображаются для этого сервера \ п"} \t \t \t} \t –

+0

EOF В вышеописанном случае я получаю следующее сообщение об ошибке : «использование: exp_continue [-continue_timer] при выполнении "exp_continue -i (1)" Я инициализируется массив идентификаторов, как: массив набор идентификаторов {1} "" –

+0

Это связано с тем, как вы смешение ожидает кода в сценарий оболочки. Вы заметили, как '$ ids (1)' превратился в '(1)'? That ' s оболочка, заменяющая переменные * before * expect, начинается.Измените heredoc на использование одинарных кавычек, чтобы оболочка не касалась переменных ожидания: '/ usr/bin/expect << 'EOF'' –