Команда не записывается в буфер с Expect - PullRequest
1 голос
/ 31 мая 2010

Я пытаюсь сделать резервную копию устройства Linkproof с помощью ожидаемого сценария, и у меня возникли некоторые проблемы. Это мой первый ожидаемый сценарий, и я достиг своих пределов;)

#!/usr/bin/expect
spawn ssh @IPADDRESS
expect "username:"
# Send the username, and then wait for a password prompt.
send "@username\r"
expect "password:"
# Send the password, and then wait for a shell prompt.
send "@password\r"
expect "#"
# Send the prebuilt command, and then wait for another shell prompt.
send "system config immediate\r"
#Send space to pass the pause
expect -re "^ *--More--\[^\n\r]*"
send ""
expect -re "^ *--More--\[^\n\r]*"
send ""
expect -re "^ *--More--\[^\n\r]*"
send ""
# Capture the results of the command into a variable. This can be displayed, or written to disk.
sleep 10
expect -re .*
set results $expect_out(buffer)
# Copy buffer in a file
set config [open linkproof.txt w]
puts $config $results
close $config
# Exit the session.
expect "#"
send "logout\r"
expect eof

Содержимое выходного файла:

Невозможно установить подлинность хоста "@IP (XXX.XXX.XXX.XXX)".

Отпечаток ключа RSA: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.

Вы уверены, что хотите продолжить подключение (да / нет)? @ Имя пользователя

Пожалуйста, введите «да» или «нет»: @ пароль

Пожалуйста, введите «да» или «нет»: конфигурация системы незамедлительно

Пожалуйста, введите «да» или «нет»:


Как видите, результат команды отсутствует в файле. Не могли бы вы помочь мне понять почему? Спасибо за вашу помощь.

Ромуальд

Ответы [ 2 ]

3 голосов
/ 08 июня 2010

Все ваши «ожидаемые» операторы имеют тайм-аут, потому что ожидаемый текст не соответствует тексту, который действительно появляется. Давайте рассмотрим первый или два, остальные все одинаковые.

Вы говорите:

expect "username:"

Но на самом деле он получает от ssh:

The authenticity of host '@IP (XXX.XXX.XXX.XXX)' can't be established.
RSA key fingerprint is XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.
Are you sure you want to continue connecting (yes/no)?

Это не содержит строку «username:», поэтому ожидаемая команда истекает, и скрипт переходит к следующей команде:

send "@username\r"

Мы видим, что он посылает:

Are you sure you want to continue connecting (yes/no)? @username

Но это неправильный ответ на этот вопрос.

И остальная часть вывода - та же самая идея снова и снова.

1 голос
/ 08 марта 2013

Как уже упоминалось @joefis, вам нужно поймать да / нет из ssh.

Я скопировал это из моего ответа в serverexchange , поскольку здесь он очень актуален

Вы не захотите использовать «Пароль:», если будете контролировать свои строки во время входа вы обнаружите, что он не всегда пишется с заглавной буквы.

Изменение ожидаемого значения -re "(. *) Assword:" или "assword:" имеет тенденцию быть гораздо эффективнее ловить линию.

Если вы обнаружите, что время еще слишком быстрое, вы можете усыпить 1; перед отправкой

Это то, что я использую для ожидания

expect {
    #When asked about authenticity, answer yes then restart expect block
    "(yes/no)?" { 
        send "yes\n"
        exp_continue 
    }
    "passphrase" { send "\r" }
    -re "(.*)assword:"  { sleep 1; send -- "password\r" }
    -re $prompt { return }
    timeout     { puts "un-able to login: timeout\n"; return }
    eof         { puts "Closed\n" ; return }
}

Итак, пара вещей, которые позволят ожидать ответа на любой из этих результатов при одном ожидании, будут продолжаться только к большей части кода, если найден оператор return. Я бы порекомендовал установить значение подсказки, поскольку оно становится полным справочным средством, чтобы определить, выполнены ли ваши команды или ваш вход в систему действительно был успешным.

...