Назад | Перейти на главную страницу

Ожидайте скрипта, таймаутов и проверки ошибок

Я надеялся немного разобраться в написанном мной сценарии ожидания.

В основном у нас есть этот ожидаемый сценарий для выполнения загрузки sftp, аутентификация по ключу не является вариантом, а sftp - единственный метод, поддерживаемый нашим поставщиком, поэтому необходимость в этом.

Я хочу иметь возможность отслеживать тайм-ауты и регистрировать код ошибки для сценариев.

Мне нужно:

Вот что у меня есть на данный момент:

set timeout 10
spawn sftp user@xxx.xxx.xxx.xxx
match_max 100000
expect "password: "
send -- "PASSWORD\n"
expect "sftp> "
send -- "lcd /data/upload\n"
expect "sftp> "
send -- "put file_yyyymmdd\n"
expect "*100%*" {send "quit\n" } \
timeout { exit 2 }
expect "sftp> "
send -- "quit\n"
expect eof

Я считаю, что код работает до истечения времени ожидания, ниже представлен журнал ожидаемого сеанса:

spawn sftp user@xxx.xxx.xxx.xxx
user@xxx.xxx.xxx.xxx's password: 
Connected to xxx.xxx.xxx.xxx.
sftp> lcd /data/upload/
sftp> put file_yyyymmdd
Uploading file_yyyymmdd to /home/user/file_yyyymmdd
file_yyyymmdd                                 0%    0     0.0KB/s   --:-- ETA
file_yyyymmdd                               100% 5835     5.7KB/s   00:00    
quit
sftp> quit

Получается, что дважды отправляется "выйти"? Что, я думаю, имеет смысл, потому что он видит 100% и немедленно отправляет «выход», прежде чем приглашение будет готово.

Какие изменения я должен внести, чтобы получить ожидаемые результаты?

Любая помощь приветствуется.

С другой стороны, я хотел бы расширить этот ожидаемый сценарий или создать другой, который обнаруживает изменение ключа DES, принимает его (отправьте «да») и продолжаю.

Однако я хотел бы знать, когда это произойдет, либо с кодом ошибки, либо с записью чего-либо в файл журнала ...

Я пробовал следующее, но это не работает должным образом:

set timeout 10
spawn sftp user@xxx.xxx.xxx.xxx
match_max 100000
expect "Are you sure you want to continue connecting (yes/no)? " {send "yes\r" } \\
timeout { exit 0 }
sleep 2
exit 3
expect eof

Идея заключалась в том, чтобы использовать коды выхода, чтобы определить, нужно ли обновлять ключ, однако он всегда возвращается как код выхода 3 (ключ изменен) и не отправляет «да», когда ключ действительно меняется.

Опять же, любая помощь будет принята с благодарностью.

На тайм-аут:

expect "*100%*" {send "quit\n" } \
timeout { exit 2 }
expect "sftp> "
send -- "quit\n"
expect eof

следует изменить на (для ясности тоже отформатирован по-другому)

expect {
  "*100%*" { } 
  timeout { exit 2 }
}
expect "sftp> "
send -- "quit\n"
expect eof

В "*100%*" { } секция сообщает ему выйти из оператора expect и перейти к следующей строке:

expect "sftp> "

Ожидаемое изменение ключа DES может потребовать экранирования скобок. Попробуйте установить exp_internal 1 в вашем скрипте, чтобы лучше видеть сообщения отладки. Это может быть неправильное совпадение.

изменить: это также может быть пробел в конце.