Используйте expect в сценарии bash, чтобы предоставить пароль для команды SSH
для тех, кто хочет ответить, что я должен использовать SSH-ключи, пожалуйста, воздерживайтесь
Я пытаюсь использовать expect в скрипте bash для предоставления пароля SSH. Предоставление пароля работает, но я не попадаю в сеанс SSH, как должен, он возвращается в bash.
мой скрипт:
#!/bin/bash
read -s PWD
/usr/bin/expect <<EOD
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com'
expect "password"
send "$PWDn"
EOD
echo "you're out"
вывод мой скрипт:
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com
usr@$myhost.example.com's password: you're out
Я хотел бы иметь свой сеанс SSH и только когда я выхожу из него, чтобы вернуться к моему скрипту bash.
Этот причина, по которой я использую bash before expect, заключается в том, что у меня есть меню, в котором я могу выбрать, к какому устройству подключиться.
спасибо
8 ответов:
смешивание Баш и ожидать не является хорошим способом для достижения желаемого эффекта. Я бы попытался использовать только ожидать:
#!/usr/bin/expect eval spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com #use correct prompt set prompt ":|#|\$" interact -o -nobuffer -re $prompt return send "my_password\r" interact -o -nobuffer -re $prompt return send "my_command1\r" interact -o -nobuffer -re $prompt return send "my_command2\r" interactпример решения для bash может быть:
#!/bin/bash /usr/bin/expect -c 'expect "\n" { eval spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com; interact }'это будет ждать ввода и возврата (на мгновение) интерактивного сеанса.
самый простой способ-это использовать sshpass. Это доступно в репозиториях Ubuntu/Debian, и вам не нужно иметь дело с интеграцией expect с bash.
пример:
sshpass -p<password> ssh <arguments> sshpass -ptest1324 ssh [email protected] ls -l /tmpвышеуказанная команда может быть легко интегрирована со скриптом bash.
Примечание: читайте Соображений Безопасности на
man sshpassдля более полного понимания последствий для безопасности.
добавить 'взаимодействовать' ожидать команды перед ОВБ:
#!/bin/bash read -s PWD /usr/bin/expect <<EOD spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com' expect "password" send "$PWD\n" interact EOD echo "you're out"Это должно позволить вам взаимодействовать с удаленной машиной до выхода из системы. Тогда ты вернешься в Баш.
после поиска ответа на вопрос в течение нескольких месяцев, я, наконец, найти действительно лучшее решение: написание простого сценария.
#!/usr/bin/expect set timeout 20 set cmd [lrange $argv 1 end] set password [lindex $argv 0] eval spawn $cmd expect "assword:" send "$password\r"; interactположите его в
/usr/bin/exp, вы можете использовать:
exp <password> ssh <anything>exp <password> scp <anysrc> <anydst>готово!
используйте вспомогательный инструмент
fd0ssh(от hxtools, а не pmt), он работает без необходимости ожидать конкретного запроса от программы ssh.
также не забудьте использовать
send -- "$PWD\r"вместо этого, как пароли, начинающиеся с тире (-) не иначе.
вышеизложенное не будет интерпретировать строку, начинающуюся с тире, как параметр команды send.
простой сценарий ожидания
Remotelogin.exp
#!/usr/bin/expect set user [lindex $argv 1] set ip [lindex $argv 0] set password [lindex $argv 2] spawn ssh $user@$ip expect "password" send "$password\r" interactпример:
./Remotelogin.exp <ip> <user name> <password>
еще один способ, который я нашел полезным использовать маленький ожидание сценария от сценария bash выглядит следующим образом.
... bash-script start bash-commands ... expect - <<EOF spawn your-command-here expect "some-pattern" send "some-command" ... ... EOF ... more bash commands ...это работает, потому что
...If the string "-" is supplied as a filename, standard input is read instead...
Comments