2010-05-31 1 views
1

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

#!/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 ключ отпечаток пальца XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.

Возможно, вы хотите продолжить соединение (да/нет)? @Username

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

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

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


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

Ромуальд

ответ

3

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

Вы говорите:

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)? 

Это не содержит строку «имя пользователя:» поэтому команда ожидать будет тайм-аут, и сценарий будет переходить к следующей команде:

send "@username\r" 

Мы можем увидеть это отправить, что:

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

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

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

1

Как упомянуто @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. Я бы рекомендовал установить значение «подсказка», так как это поможет полностью определить, завершены ли ваши команды или ваш логин действительно удался.