Использовать в bash script для обеспечения пароля для команды SSH.

Для тех, кто хочет ответить, что я должен использовать SSH-ключи, пожалуйста, воздержитесь

Я пытаюсь использовать wait в bash script для предоставления пароля SSH. Предоставление пароля работает, но я не попадаю в SSH-сессию, как должен, он возвращается обратно к bash.

Мой script:

#!/bin/bash

read -s PWD

/usr/bin/expect <<EOD
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no [email protected]$myhost.example.com'
expect "password"
send "$PWD\n" 
EOD
echo "you're out"

Выход моего script:

spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no [email protected]$myhost.example.com
[email protected]$myhost.example.com password: you're out

Я хотел бы иметь сеанс SSH и только когда я выхожу из него, чтобы вернуться к моему bash script. Причина, по которой я использую bash перед ожиданием, заключается в том, что у меня есть меню, в котором я могу выбрать, к какому устройству подключиться.

Спасибо

Ответ 1

Смешивание bash и ожидание - не лучший способ добиться желаемого эффекта. Я бы попытался использовать только Expect:

#!/usr/bin/expect
eval spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no [email protected]$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 [email protected]$myhost.example.com; interact }'

Это будет ждать ввода и возврата (на мгновение) интерактивного сеанса.

Ответ 2

Самый простой способ - использовать sshpass. Это доступно в репозиториях Ubuntu/Debian, и вам не нужно заниматься интеграцией с помощью bash.

Пример:

sshpass -p<password> ssh <arguments>
sshpass -ptest1324 ssh [email protected] ls -l /tmp

Вышеприведенная команда может быть легко интегрирована с bash script.

Примечание. Пожалуйста, прочитайте раздел "Вопросы безопасности" в man sshpass для полного понимания последствий для безопасности.

Ответ 3

Добавьте ожидаемую команду "взаимодействовать" непосредственно перед вашим EOD:

#!/bin/bash

read -s PWD

/usr/bin/expect <<EOD
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no [email protected]$myhost.example.com
expect "password"
send "$PWD\n" 
interact
EOD
echo "you're out"

Это должно позволить вам взаимодействовать с удаленным компьютером до выхода из системы. Тогда ты вернешься в Баш.

Ответ 4

После поиска ответа на вопрос в течение нескольких месяцев, я наконец нашел действительно лучшее решение: написание простого script.

#!/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>

Готово!

Ответ 5

Простой пример script

Remotelogin.exp

    #!/usr/bin/expect
    set user [lindex $argv 1]
    set ip [lindex $argv 0]
    set password [lindex $argv 2]
    spawn ssh [email protected]$ip
    expect "password"
    send "$password\r"
    interact

Пример:

    ./Remotelogin.exp <ip> <user name> <password>

Ответ 6

Используйте вспомогательный инструмент fd0ssh (из hxtools, а не pmt), он работает, не ожидая определенного запроса от программы ssh.

Ответ 7

Также убедитесь, что используете

send -- "$PWD\r" 

вместо этого, поскольку пароли, начинающиеся с тире (-), не будут работать иначе.

Вышеуказанное не будет интерпретировать строку, начинающуюся с тире, в качестве опции команды отправки.

Ответ 8

Другим способом, который мне показалось полезным использовать небольшой ожидаемый script из bash script, является следующий.

...
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...

Ответ 9

sshpass работает, если вы пытаетесь использовать его внутри цели сборки Sublime Text, внутри Makefile. Вместо sshpass вы можете использовать passh: https://github.com/clarkwang/passh

С sshpass вы бы сделали:

sshpass -p ssh [email protected]

С passh вы бы сделали:

passh -p ssh [email protected]

Примечание. Не забудьте использовать -o StrictHostKeyChecking=no, иначе соединение будет зависать при первом его использовании. Например:

passh -p ssh -o StrictHostKeyChecking=no [email protected]

Рекомендации:

  1. Команда send для пароля не работает с использованием ожидаемого сценария в ssh-соединении
  2. https://askubuntu.com/info/87449/how-to-disable-strict-host-key-checking-in-ssh
  3. https://linuxcommando.blogspot.com/2008/10/how-to-disable-ssh-host-key-checking.html
  4. https://serverfault.com/info/330503/scp-without-known-hosts-check
  5. https://debian-administration.org/article/587/pam_mount_and_sshfs_with_password_authentication