如何使用文件描述符向多个 ssh 广播?

如何使用文件描述符向多个 ssh 广播?

我希望能够以交互方式向多个服务器广播相同的命令,这意味着我想发送一个命令,查看结果并发送另一个命令。这些命令是任意的,不能编写脚本。

问题如何通过 SSH 自动远程运行命令?如果您倾向于使用建议的工具,例如:pssh、sdh、gsh、cluster-ssh,则可以很好地解决此问题。
但我正在尝试找出是否有更低级别的解决方案,仅使用标准 SSH。

我的问题是,您能否想出一种方法,在 BASH 中打开多个 SSH,将文件重定向到其中,这样每次我写入文件时,新文本都会重定向到 SSH 并执行。
如果有理由说明为什么上述操作无法完成,我很乐意了解为什么这是不可能的。

答案1

一种方法是使用共同进程

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

现在$foo是两个文件描述符的数组;${foo[0]}是 ssh 的 stdout,并且写入 fd${foo[1]}将发送到 ssh 的 stdin。

$ 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

相关内容