Я пытаюсь создать соединение SSH и сделать некоторые вещи на удаленном сервере из сценария.
Однако терминал предлагает мне пароль, затем открывает соединение в окне терминала вместо сценария. Команды не становятся выполняемыми, пока я не выхожу из соединения.
Как может я ssh из сценария удара?
Если вы хотите, чтобы запрос пароля исчез, используйте аутентификацию на основе ключа ( описана здесь ).
Для удаленного запуска команд через ssh вы должны указать их как аргумент ssh, например:
root @ host : ~ # ssh root @ www 'ps -ef | grep apache | grep -v grep | wc -l '
Если вы хотите продолжать использовать пароли и не использовать обмен ключами, вы можете сделать это с помощью команды «ожидать», например:
#!/usr/bin/expect -f
spawn ssh user@hostname
expect "password:"
sleep 1
send "<your password>\r"
command1
command2
commandN
Что вам нужно сделать, так это обменять SSH-ключи для пользователя, от имени которого запускается скрипт. Взгляните на это руководство
После этого ваши сценарии будут работать без необходимости ввода пароля. Но в целях безопасности не следует делать этого для пользователей root!
Есть еще один способ сделать это с помощью общих подключений, то есть: кто-то инициирует подключение, используя пароль, и каждое последующее подключение будет мультиплексироваться по одному и тому же каналу, что устраняет необходимость в повторной аутентификации. (И это тоже быстрее)
# ~/.ssh/config
ControlMaster auto
ControlPath ~/.ssh/pool/%r@%h
, тогда вам просто нужно войти в систему, и пока вы вошли в систему, сценарий bash сможет открывать ssh-соединения.
Затем вы можете остановить работу вашего скрипта, если кто-то еще не открыл канал:
ssh ... -o KbdInteractiveAuthentication=no ....