Используйте 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, заключается в том, что у меня есть меню, в котором я могу выбрать, к какому устройству подключиться.



спасибо

797   8  

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

    Ничего не найдено.