Назад | Перейти на главную страницу

Как выполнить команду с произвольно длинным выводом на удаленных серверах, а затем остановиться?

Я знаю, что могу выполнить команду на удаленном сервере (см. этот вопрос на 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.