Uma maneira é usar coprocessos .
$ coproc foo { ssh -T foo.domain; }
Agora, $foo
é uma matriz de dois descritores de arquivos; ${foo[0]}
é o stdout do ssh e escrever para fd ${foo[1]}
enviará para o stdin do ssh.
$ echo "whoami" >&${foo[1]}
$ head -n 1 <&${foo[0]}
grawity
$
(Acessar /proc/$$/fd/${foo[1]}
também funcionaria.)
Outra maneira - pipes nomeados .
$ mkfifo {foo,bar}.{in,out}
$ ssh foo <foo.in >foo.out &
$ ssh bar <bar.in >bar.out &
$ echo "whoami" | tee foo.in bar.in
Similar - substituição de processos .
$ echo "whoami" | tee >(ssh foo) >(ssh bar)
Por mais de um comando:
$ mkfifo in
$ tee >(ssh foo) >(ssh bar) <in &
$ echo "whoami" >in
Mas, como os canos quebram facilmente, você pode precisar recorrer a arquivos comuns.
(Este exemplo colocará o arquivo em /dev/shm
para evitar bater no disco toda vez.)
$ 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
E:
$ f=/dev/shm/in; touch $f
$ tail -f $f | tee >(ssh foo) >(ssh bar) &
$ echo foo >> $f