我希望能够以交互方式向多个服务器广播相同的命令,这意味着我想发送一个命令,查看结果并发送另一个命令。这些命令是任意的,不能编写脚本。
问题如何通过 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