Como posso transmitir para vários ssh usando o descritor de arquivos?

1

Eu quero poder transmitir os mesmos comandos para vários servidores interativamente, o que significa que quero enviar um comando, visualizar o resultado e enviar outro comando. Os comandos são arbitrários e não podem ser roteirizados.

A pergunta Como posso automatizar a execução de comandos remotamente por SSH? ? resolve este problema muito bem se você está propenso a usar as ferramentas sugeridas como: pssh, sdh, gsh, cluster-ssh.
Mas estou tentando descobrir se existe uma solução de nível mais baixo, usando apenas o SSH padrão.

Minha pergunta é que você pode pensar em uma maneira no BASH para abrir vários SSHs, redirecionar para eles um arquivo, então toda vez que eu escrevo no arquivo, o novo texto é redirecionado para o SSH e executado.
Se houver um raciocínio por trás do motivo pelo qual isso não pode ser feito, ficarei feliz em saber por que isso não é possível.

    
por RaamEE 02.03.2011 / 14:25

1 resposta

2

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
    
por 02.03.2011 / 21:39

Tags