Я знаю, что могу выполнить команду на удаленном сервере (см. этот вопрос на SO).
Я хочу выполнить одну команду на нескольких удаленных серверах (возможно, используя сценарий, чтобы перебрать их все?), Где вывод команды будет иметь произвольно длинный вывод (т.е. вывод не остановится, пока я не нажму Ctrl + C
). Я также хочу иметь возможность остановить выполнение программы на удаленных серверах, которые выполняет эта команда.
Как мне выполнить команду с моей локальной машины на произвольном количестве удаленных серверов, где (1) команда имеет неопределенную длину вывода и (2) команда завершается?
Давайте сделаем все хосты в цикле, и для простоты вы можете захотеть выполнить каждый ssh в его собственном xterm. Итак, мы могли бы использовать однострочник вроде этого:
for host in host1 host2 host3; do xterm -e ssh $host -t "echo -e '\033];$host\07'; YOUR_COMMAND >/tmp/$host.log 2>&1& tail -f /tmp/$host.log"& done
Краткое объяснение его частей:
>/tmp/$host.log 2>&1
перенаправляет ваш вывод в файл - возможно, вы захотите собрать его позже.
Часть echo в удаленной команде отправляет escape-последовательность, которая маркирует ваш xterm именем хоста. Так что если у вас их 50, вы все равно знаете, что к чему.
2>&1
перенаправляет вывод ошибок в тот же файл журнала.
Следующий &
фоны YOUR_COMMAND на хосте, поэтому tail может показать вам его вывод.
Последний &
отправляет локальную команду xterm в фоновый режим, поэтому у вас может быть много из них одновременно.
Конечно, вы можете опустить все эти "сложные" вещи, просто следите за своими xterms и нажимайте ^ C в каждом из них, когда вы насмотрелись:
for host in host1 host2 host3; do xterm -e ssh $host -t YOUR_COMMAND&
done
Что ж, если бы у вас не было требований к длинному выводу и прерыванию по Ctrl + C, я бы посоветовал вам ansible. Однако в данном случае это больше похоже на работу для какой-то мульти-консоли, например терминатора:
https://gnometerminator.blogspot.cz/p/introduction.html
Он копирует то, что вы пишете, в один из терминалов, чтобы разрешить другим (когда эта опция включена).
Ты пробовала ssh
через for
петля? Вы можете завершить каждую команду, и цикл продолжится.
[root@hostXYZ scripts]# for vm in host1 host2 host3; do ssh -t root@$vm "echo test; read"; done
test
^CConnection to host1 closed.
test
^CConnection to host2 closed.
test
^CConnection to host3 closed.
[root@hostXYZ scripts]# for vm in host1 host2 host3; do ssh -t root@$vm "echo test; read"; done
test
Connection to host1 closed.
test
Connection to host2 closed.
test
Connection to host3 closed.