Как выйти из SSH-соединения в скрипте bash

Как выйти из SSH-соединения в скрипте bash

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

Я создаю скрипт, в котором я подключаюсь по ssh к нескольким разным хостам по одному за разом. Цель — подключиться по ssh к машине, выполнить несколько локальных команд, выполнить скрипт, дождаться его завершения, а затем выйти из сеанса ssh и перейти к следующему.

Однако когда я использую команду «exit», она не работает и просто завершает работу скрипта.

решение1

Я предполагаю, что ваш скрипт не выходит из сеанса оболочки, потому что вы вызываете его напрямую с помощью ./exit.sh. sourceВместо этого вам следует это сделать.

Затем оператор exitв вашем скрипте закроет сеанс оболочки.

$ source exit.sh
# or
$ . exit.sh

Встроенная sourceфункция выполняет ваш скрипт втекущий контекст оболочки, в то время как ./exit.shзапускаетновая оболочкачтобы запустить его.

решение2

Вы пробовали поместить команды в файл и использовать с ним cat или EOF?

ssh -t [email protected] << EOF
 command1
 command2
 exit
EOF

решение3

Я бы рекомендовал обратить внимание psshна то, чего вы пытаетесь добиться — он позволяет вам легко справляться с нюансами открытия/закрытия соединений между машинами и даже может работать параллельно, чтобы сократить время выполнения.

Он по-прежнему используется sshв качестве транспортного протокола, поэтому он, очевидно, так же безопасен, как и кольцевое sshсоединение.

https://linux.die.net/man/1/pssh

решение4

Обычно вы можете сделать forцикл sshбез проблем.

$ for srv in 192.168.88.138; do echo $srv:; ssh $srv uptime; done
192.168.88.138:
 13:27:25 up 30 days,  8:42,  1 user,  load average: 4.15, 4.06, 4.06

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

Если вы делаете что-то сложное, я бы рекомендовал создать скрипт в отдельном файле, а затем scpзагрузить его на сервер, на котором вы хотите его запустить, а затем зайти по ssh, чтобы запустить его. Попытка засунуть что-то сложное в ssh с помощью кавычек и экранирований обычно сложнее, чем того стоит.

Я делал это сотни раз, и это отлично работает, когда вы хотите, чтобы все работало на одном сервере одновременно. Если вы хотите, чтобы все работало параллельно, есть и другие варианты, но я бы посмотрел напервый.

Связанный контент