Я надеялся немного разобраться в написанном мной сценарии ожидания.
В основном у нас есть этот ожидаемый сценарий для выполнения загрузки 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
в вашем скрипте, чтобы лучше видеть сообщения отладки. Это может быть неправильное совпадение.
изменить: это также может быть пробел в конце.