Используйте ожидаемый в скрипте bash пароль для команды SSH - PullRequest
119 голосов
/ 24 января 2011

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

Я пытаюсь использовать ожидаемый в скрипте 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 "$PWD\n" 
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 раньше ожидаемого, заключается в том, что у меня есть меню, в котором я могу выбрать, к какому устройству подключаться.

Спасибо

Ответы [ 9 ]

76 голосов
/ 24 января 2011

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

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

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

51 голосов
/ 08 июля 2013

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

Пример:

sshpass -p<password> ssh <arguments>
sshpass -ptest1324 ssh user@192.168.1.200 ls -l /tmp

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

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

18 голосов
/ 24 января 2011

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

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

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

13 голосов
/ 03 февраля 2015

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

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

Готово!

7 голосов
/ 23 сентября 2016

Простой сценарий ожидания

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>
6 голосов
/ 22 января 2014

Также убедитесь, что вместо этого используется

send -- "$PWD\r" 

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

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

6 голосов
/ 24 января 2011

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

4 голосов
/ 30 декабря 2014

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

0 голосов
/ 28 апреля 2019

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

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

sshpass -p ssh user@host

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

passh -p ssh user@host

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

passh -p ssh -o StrictHostKeyChecking=no user@host

Ссылки:

  1. Команда отправки для пароля не работает с использованием сценария ожидаемого соединения ssh
  2. https://askubuntu.com/questions/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/questions/330503/scp-without-known-hosts-check
  5. https://debian -administration.org / article / 587 / pam_mount_and_sshfs_with_password_authentication
...