Скрипт останавливается после выполнения SSH - PullRequest
0 голосов
/ 28 июня 2018

Когда я выполняю SSH на какой-то машине внутри цикла for, он выполняет ssh, но не может выполнить дальше. Код похож на:

string=c01.test.cloud.com,c02.test.cloud.com
for i in $(echo $string | sed "s/,/ /g")
do
    ssh -t -t AppAccount@$i
    cd a/b/c
    str2=x,y,z
done

1 Ответ

0 голосов
/ 28 июня 2018

Я понял из вашего вопроса, что вы ожидаете, что cd a/b/c будет запущен на удаленном сервере? Это не то, что делает этот скрипт. Звонок на ssh открывает SSH-туннель и предоставляет вам интерактивное терминальное соединение. Затем он ожидает завершения соединения. (Я подозреваю, что если вы нажмете Control-D, сценарий продолжится.) Использование -t -t здесь особенно странно. Почему вы хотите заставить удаленный Pty? Это усугубляет проблему (не так сильно, так как она все равно не будет работать, но это, похоже, противоположно тому, что вы хотели бы).

Я думаю, что вы имели в виду сценарий:

string=c01.test.cloud.com,c02.test.cloud.com
for i in $(echo $string | sed "s/,/ /g")
do
    ssh AppAccount@$i 'cd a/b/c; str2=x,y,z'
done

(Это, конечно, ничего не даст, но я предполагаю, что ваш реальный скрипт имеет больше, чем просто установка переменной оболочки и выход.) Дело в том, что вам нужно передать скрипт, который вы хотите запустить, как параметр для SSH. В противном случае он будет порождать интерактивную оболочку и ждать, пока вы ее закроете.

Обратите внимание, что если ваш скрипт очень сложный, может быть очень неудобно помещать все это в строку в одинарных кавычках. Если ваш внутренний скрипт находится в своем собственном файле, простой способ справиться с этим - использовать bash -s, который читает скрипт из stdin:

cat some_script | ssh server 'bash -s'

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...