Как вводить автоматически при запуске оболочки через SSH?
В моей оболочке script Я запускаю команду, которая просит меня ввести.
Как я могу дать команде входной сигнал, который ему нужен автоматически?
Например:
$cat test.sh
ssh-copy-id [email protected]
При запуске test.sh:
-
Сначала он спросит:
Are you sure you want to continue connecting (yes/no)?
-
Затем он попросит меня ввести пароль:
[email protected] password:
Есть ли способ ввести это автоматически?
Ответы
Ответ 1
Для общей автоматизации командной строки Expect является классическим инструментом. Или попробуйте pexpect, если вам удобнее с Python.
Вот аналогичный вопрос, который предлагает использовать Expect: используйте ожидаемый в скрипте bash, чтобы предоставить пароль для команды SSH
Ответ 2
Для простого ввода, например двух подсказок и двух соответствующих фиксированных ответов, вы также можете использовать "здесь документ", синтаксис которого выглядит следующим образом:
test.sh <<!
y
pasword
!
< < префиксы шаблона, в данном случае '!'. Все до строки, начинающейся с этого шаблона, интерпретируется как стандартный ввод. Этот подход похож на предложение о подключении многострочного эха в ssh, за исключением того, что он сохраняет fork/exec команды echo, и я считаю его более читаемым. Другим преимуществом является то, что он использует встроенную функциональность оболочки, поэтому она не зависит от ожидаемого.
Ответ 3
Определенно... Используйте команды spawn, expect и send:
spawn test.sh
expect "Are you sure you want to continue connecting (yes/no)?"
send "yes"
Есть больше примеров для, см.
Справка с ожиданием в bash script
Возможно, вам придется сначала установить эти команды, в зависимости от вашей системы.
Ответ 4
ssh-key с парольной фразой, с цепочкой ключей
keychain - небольшая утилита, которая управляет ssh-агентом от вашего имени и позволяет ssh-agent оставаться включенным при завершении сеанса входа в систему. При последующих логинах keychain подключается к существующему экземпляру ssh-agent. На практике это означает, что кодовая фраза должна вводиться только во время первого входа после перезагрузки. При последующих входах используется незашифрованный ключ из существующего экземпляра ssh-agent. Это также может быть полезно для обеспечения беспроблемной аутентификации RSA/DSA в заданиях cron без ssh-ключей без пароля.
Чтобы включить keychain, установите его и добавьте что-то вроде следующего в ~/.bash_profile:
eval keychain --agents ssh --eval id_rsa
С точки зрения безопасности, ssh-ident и keychain хуже, чем экземпляры ssh-agent, ограниченные временем жизни определенного сеанса, но они предлагают высокий уровень удобства. Чтобы улучшить безопасность keychain, некоторые люди добавляют параметр --clear в свой вызов ~/.bash_profile keychain. Выполняя эту кодовую фразу, необходимо снова ввести логин, как указано выше, но задания cron все равно будут иметь доступ к незашифрованным ключам после выхода пользователя из системы. Страница wiki-страницы с цепочкой ключей содержит больше информации и примеров.
Получил эту информацию от;
https://unix.stackexchange.com/questions/90853/how-can-i-run-ssh-add-automatically-without-password-prompt
Надеюсь, что это поможет
Я лично смог автоматически ввести свою кодовую фразу при запуске терминала, выполнив это: (вы можете, конечно, изменить script и поместить его в соответствии с вашими потребностями)
-
отредактируйте файл bashrc, чтобы добавить этот script;
Проверьте, не активирован ли агент SSH
если [-z "$ SSH_AUTH_SOCK" ]; тогда
exec ssh-agent bash -c "ssh-add; $0"
echo "Агент SSH был пробужден"
Выход
ц
Вышеуказанная строка начнет ожидать script при запуске терминала.
./ssh.exp
здесь содержание этого ожидает script
#!/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 script (вы должны поместить оба сценария в свою домашнюю папку, обычно /home/user )
#!/bin/bash
ssh-add /the/path/of/yourkey_id_rsa
exit 0
Я бы настоятельно предложил шифровать пароль на .exp script, а также переименовать этот .exp файл в нечто вроде term_boot.exp или что-то еще для целей безопасности. Не забывайте создайте файлы непосредственно с терминала с помощью nano или vim (например: nano ~/.bashrc | nano term_boot.exp
), а также chmod +x script.sh
, чтобы сделать его исполняемым. A chmod +r term_boot.exp
также будет полезен, но вам нужно будет добавить sudo до. /ssh.exp в файле bashrc. Таким образом, каждый раз, когда вы запускаете терминал, вам придется вводить пароль sudo. Для меня это более удобно, чем парольная фраза, потому что я помню пароль администратора (sudo) у очага.
Кроме того, здесь другой способ сделать это, я думаю;
https://www.cyberciti.biz/faq/noninteractive-shell-script-ssh-password-provider/
Конечно, я изменю свой метод для этого, когда у меня будет время.
Ответ 5
Также вы можете направить ответы в сценарий:
printf "y\npassword\n" | sh test.sh
где \n
- escape-последовательность