Я борюсь с классической проблемой ввода пароля автоматически в ssh, и, как и все остальные, я спотыкаюсь в неведении относительно ожидания.Наконец, я собрал воедино скрипт, который вроде работает:
#!/usr/bin/expect -f
# command line args
set user_at_host [lrange $argv 0 0]
set password [lrange $argv 1 1]
set timeout 1
# ssh command
spawn ssh -S ~/.ssh/tmp.$user_at_host -M -N -f $user_at_host
# deal with ssh prompts
expect {
"*yes/no*" { send "yes\r" ; exp_continue }
"*assword:" { send "$password\r" ; exp_continue }
}
Этот скрипт завершается только благодаря строке timeout 1
, без него он просто зависает и завершается только при взаимодействии с пользователем (^C
).
Когда строка spawn
была прямой командой ssh, сценарий сразу заканчивался, однако это не ваш прямой ssh .Отличительной особенностью может быть опция -f
, которая запускает его в фоновом режиме (но я пробовал сценарий без него).
Я прочитал, что interact
или expect eof
могут помочь, но я не смог найти правильное заклинание, которое действительно сделает это.
Мой вопрос (я думаю): Как создать ожидаемый сценарий, который порождает фоновый процесс, завершить безtimeout?
Редактировать: я должен был ожидать (не каламбур) ответ "использовать аутентификацию ssh без пароля".Хотя это разумный совет, в моем сценарии это не подходящее решение: автоматическое тестирование установленной системы vanilla в доверенной среде, где добавление доверенных ключей к образу нежелательно / невозможно.