Использовать в 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]
Рекомендации:
- Команда send для пароля не работает с использованием ожидаемого сценария в ssh-соединении
- https://askubuntu.com/info/87449/how-to-disable-strict-host-key-checking-in-ssh
- https://linuxcommando.blogspot.com/2008/10/how-to-disable-ssh-host-key-checking.html
- https://serverfault.com/info/330503/scp-without-known-hosts-check
- https://debian-administration.org/article/587/pam_mount_and_sshfs_with_password_authentication