Я прочитал несколько сообщений здесь на эту тему, но все решения, которые я нахожу, сводятся к одной строке, где нужно выполнить одну команду.
Я создаю скрипт, в котором я подключаюсь по 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
соединение.
решение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 с помощью кавычек и экранирований обычно сложнее, чем того стоит.
Я делал это сотни раз, и это отлично работает, когда вы хотите, чтобы все работало на одном сервере одновременно. Если вы хотите, чтобы все работало параллельно, есть и другие варианты, но я бы посмотрел наansibleпервый.