Я пытаюсь использовать Expect в сценарии Bash, чтобы предоставить пароль SSH. Предоставление пароля работает, но я не попадаю в сеанс SSH, как должен. Он идет прямо к Башу.
Мой сценарий:
#!/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 перед Expect, заключается в том, что мне нужно использовать меню. Я могу выбрать, к какому устройству / устройству подключиться.
Тем, кто хочет ответить, что я должен использовать ключи SSH, воздержитесь.
Ответы:
Смешивание Bash и Expect - не лучший способ добиться желаемого эффекта. Я бы попробовал использовать только Expect:
Пример решения для bash может быть:
Это подождет, Enterа затем вернется (на мгновение) к интерактивному сеансу.
источник
Самый простой способ - использовать sshpass . Это доступно в репозиториях Ubuntu / Debian, и вам не нужно иметь дело с интеграцией expect с Bash.
Пример:
Приведенную выше команду можно легко интегрировать со сценарием Bash.
Примечание: Пожалуйста , прочитайте соображения безопасности раздел
man sshpass
для полного понимания последствий безопасности.источник
sshpass
, что это произойдет, но даже тогда есть период, когда он все еще запускается, прежде чем он сможет это сделать, когда пароль доступен для любого / каждого процесса.sshpass
используется в сценарии, когда у вас есть простые тестовые сценарии, которые выполняются в локальной сетевой среде, где безопасность не является главной проблемой. Фактически, есть раздел, вman sshpass
котором объясняется целый раздел, посвященный соображениям безопасности. Добавил это в ответ, спасибо.Добавьте команду Expect 'interact' непосредственно перед EOD:
Это должно позволить вам взаимодействовать с удаленным компьютером, пока вы не выйдете из системы. Тогда вы вернетесь в Баш.
источник
expect eof
решило проблему.'
из,usr@$myhost.example.com'
и он должен работать. И, возможно, вам нужно заменить\n
на\r
, но YMMVЯ месяцами искал ответ на вопрос и наконец нашел действительно лучшее решение: написать простой сценарий.
Положите его
/usr/bin/exp
, тогда вы можете использовать:exp <password> ssh <anything>
exp <password> scp <anysrc> <anydst>
Готово!
источник
expect "assword:"
ты имел ввидуexpect "password:"
?"assword"
будет соответствовать обоимPassword
иpassword
.Также обязательно используйте
вместо этого, поскольку пароли, начинающиеся с тире (-), в противном случае не будут работать.
Вышеупомянутое не будет интерпретировать строку, начинающуюся с тире, как параметр для команды отправки.
источник
Простой скрипт Expect:
Файл Remotelogin.exp
Пример:
источник
Используйте вспомогательный инструмент
fd0ssh
(из hxtools, а не pmt). Он работает, не ожидая отssh
программы конкретного запроса .источник
echo "yoursshpass" | fd0ssh ssh -c -L$port:$ip:$remote_port user@yourserver.com &
конфиг : СПАСИБО!sshpass
.Другой способ, который я нашел полезным использовать небольшой сценарий Expect из сценария Bash, заключается в следующем.
Это работает, потому что
...If the string "-" is supplied as a filename, standard input is read instead...
источник
-
, так как по умолчаниюexpect
читаетсяstdin
, если вы вызываете его без аргументов. Однако это полезно, если вы хотите запустить его в интерактивном режиме без командной строки (expect
vs.expect -
) или если вы делаете что-то вроде того,expect -f "$@"
где первым аргументом должен быть файл, даже если он выглядит как опция (начинается с-
). В этом случае, если$1
(данный файл)-
это читается изstdin
.sshpass
не работает, если вы попытаетесь использовать его внутри цели сборки Sublime Text , внутри Makefile. Вместо этогоsshpass
вы можете использоватьpassh
: https://github.com/clarkwang/passhС
sshpass
вами сделали бы:С
passh
вами сделали бы:Примечание: не забывайте использовать
-o StrictHostKeyChecking=no
. В противном случае соединение будет зависать при первом использовании. Например:Ссылки:
источник