1

Я хочу иметь возможность транслировать одни и те же команды на несколько серверов в интерактивном режиме, то есть хочу отправить команду, просмотреть результат и отправить другую команду. Команды являются произвольными и не могут быть записаны в сценарии.

Вопрос Как я могу автоматизировать запуск команд удаленно через SSH? решает эту проблему очень хорошо, если вы склонны использовать такие инструменты, как: pssh, sdh, gsh, cluster-ssh.
Но я пытаюсь выяснить, есть ли более низкоуровневое решение, только используя стандартный SSH.

Мой вопрос заключается в том, можете ли вы подумать о том, как в BASH открыть несколько SSH, перенаправить в них файл, поэтому каждый раз, когда я пишу в файл, новый текст перенаправляется в SSH и выполняется.
Если есть причина, почему вышеупомянутое не может быть сделано, я был бы счастлив узнать, почему это невозможно.

1 ответ1

2

Одним из способов является использование сопроцессов.

$ coproc foo { ssh -T foo.domain; }

Теперь $foo - это массив двух файловых дескрипторов; ${foo[0]} - это стандартный вывод ssh, и запись в fd ${foo[1]} отправит в стандартный вывод ssh.

$ echo "whoami" >&${foo[1]}
$ head -n 1 <&${foo[0]}
grawity
$

(Доступ к /proc/$$/fd/${foo[1]} будет работать.)


Другой способ - именованные трубы.

$ mkfifo {foo,bar}.{in,out}
$ ssh foo <foo.in >foo.out &
$ ssh bar <bar.in >bar.out &
$ echo "whoami" | tee foo.in bar.in

Похоже - процесс замещения.

$ echo "whoami" | tee >(ssh foo) >(ssh bar)

Для более чем одной команды:

$ mkfifo in
$ tee >(ssh foo) >(ssh bar) <in &
$ echo "whoami" >in

Но поскольку каналы легко ломаются, вам, возможно, придется прибегнуть к обычным файлам.

(Этот пример поместит файл в /dev/shm чтобы избежать попадания на диск каждый раз.)

$ f=/dev/shm/in; touch $f
$ tail -f $f | ssh foo &
$ tail -f $f | ssh bar &
$ echo foo > $f 
$ echo bar >> $f; # note: >> for appending

А также:

$ f=/dev/shm/in; touch $f
$ tail -f $f | tee >(ssh foo) >(ssh bar) &
$ echo foo >> $f

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .