Как вводить автоматически при запуске оболочки через SSH? - PullRequest
28 голосов
/ 31 января 2012

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

Как я могу автоматически дать команде необходимый ввод?

Например:

$cat test.sh
ssh-copy-id tester@10.1.2.3

При запуске test.sh:

  • Сначала он спросит:

    Are you sure you want to continue connecting (yes/no)?

  • Затем он попросит меня ввести пароль:

    tester@10.1.2.3's password:

Есть ли способ ввести это автоматически?

Ответы [ 4 ]

33 голосов
/ 25 сентября 2012

Для простого ввода, например, двух запросов и двух соответствующих фиксированных ответов, вы также можете использовать «документ здесь», синтаксис которого выглядит следующим образом:

test.sh <<!
y
pasword
!

<< префикс шаблона, в данном случае '!'. Все, вплоть до строки, начинающейся с этого шаблона, интерпретируется как стандартный ввод. Этот подход аналогичен предложению направить многострочное эхо в ssh, за исключением того, что он сохраняет ответвление / exec команды echo, и я нахожу его немного более читабельным. Другое преимущество заключается в том, что он использует встроенные функции оболочки, поэтому он не зависит от ожидаемого. </p>

16 голосов
/ 31 января 2012

Для общей автоматизации командной строки Ожидайте - классический инструмент.Или попробуйте pexpect , если вы чувствуете себя более комфортно с Python.

Вот аналогичный вопрос, который предлагает использовать Expect: Используйте ожидаемый в скрипте bash пароль для команды SSH

7 голосов
/ 31 января 2012

Определенно есть ... Используйте команды spawn, ожидайте и отправляйте:

spawn test.sh
expect "Are you sure you want to continue connecting (yes/no)?"
send "yes"

Существует множество примеров по переполнению стека, см .: Справка по Expect в скрипте bash

Возможно, вам потребуется сначала установить эти команды, в зависимости от вашей системы.

1 голос
/ 15 сентября 2017

ssh-ключ с парольной фразой, с цепочкой для ключей

keychain - это небольшая утилита, которая управляет ssh-agent от вашего имени и позволяет ssh-agent оставаться запущенным после завершения сеанса входа в систему. При последующих входах в систему цепочка для ключей подключится к существующему экземпляру ssh-agent. На практике это означает, что парольную фразу необходимо вводить только во время первого входа в систему после перезагрузки. При последующих входах в систему используется незашифрованный ключ из существующего экземпляра ssh-agent. Это также может быть полезно для разрешения аутентификации RSA / DSA без пароля в заданиях cron без ssh-ключей без пароля.

Чтобы включить связку ключей, установите ее и добавьте что-то вроде следующего в ~ / .bash_profile:

eval keychain --agents ssh --eval id_rsa С точки зрения безопасности, ssh-идент и цепочка для ключей хуже, чем экземпляры ssh-agent, ограниченные временем жизни конкретного сеанса, но они предлагают высокий уровень удобства. Чтобы повысить безопасность цепочки для ключей, некоторые люди добавляют опцию --clear к своему вызову цепочки для ключей ~ / .bash_profile. При этом необходимо повторно вводить парольные фразы при входе в систему, как указано выше, но задания cron по-прежнему будут иметь доступ к незашифрованным ключам после выхода пользователя из системы. Вики-страница цепочки для ключей содержит больше информации и примеров.

Получил эту информацию от;

https://unix.stackexchange.com/questions/90853/how-can-i-run-ssh-add-automatically-without-password-prompt

Надеюсь, это поможет

Я лично смог автоматически ввести свою фразу-пароль при запуске терминала, выполнив следующее: (конечно, вы можете изменить скрипт и приспособить его к вашим потребностям)

  1. отредактируйте файл bashrc, чтобы добавить этот скрипт;

    Проверьте, не активен ли агент SSH

    if [-z "$ SSH_AUTH_SOCK"]; затем exec ssh-agent bash -c "ssh-add; $ 0" echo "Агент SSH был разбужен" выход фи

    Над строкой запускается ожидаемый скрипт при запуске терминала.

    . / Ssh.exp

вот содержимое этого ожидаемого скрипта

#!/usr/bin/expect

set timeout 20

set passphrase "test"

spawn "./keyadding.sh"

expect "Enter passphrase for /the/path/of/yourkey_id_rsa:"

send "$passphrase\r";

interact

Вот содержимое моего скрипта keyadding.sh (вы должны поместить оба скрипта в свою домашнюю папку, обычно / home / user)

#!/bin/bash

ssh-add /the/path/of/yourkey_id_rsa

exit 0

Я НАСТОЯТЕЛЬНО рекомендую зашифровать пароль в сценарии .exp, а также переименовать этот файл .exp в нечто вроде term_boot.exp или что-либо еще в целях безопасности. Не забудьте создать файлы непосредственно из терминала, используя nano или vim (например: nano ~/.bashrc | nano term_boot.exp), а также chmod +x script.sh, чтобы сделать его исполняемым. chmod +r term_boot.exp также будет полезно, но вам придется добавить sudo перед ./ssh.exp в вашем файле bashrc. Таким образом, вам придется вводить пароль sudo каждый раз, когда вы запускаете свой терминал. Для меня это удобнее, чем парольная фраза, потому что я помню свой пароль администратора (sudo) под очагом.

Кроме того, вот еще один способ сделать это, я думаю; https://www.cyberciti.biz/faq/noninteractive-shell-script-ssh-password-provider/

Определенно изменит мой метод для этого, когда у меня будет время.

...