Eu gosto deste formulário ao fazer isso:
$ cat hosts.txt | xargs -n1 -P8 sh -c 'ssh -T "$1" bash -s < ./hello.bash' sh
Ou com {}
se você precisar deles:
$ cat hosts.txt | xargs -n1 -P8 -I{} sh -c 'ssh -T "$1" bash -s < ./hello.bash' sh {}
Exemplo
hello.bash$ cat hello.bash
#!/bin/bash
echo "hi from server: $(hostname)"
ssh xargs
$ cat hosts.txt | xargs -n1 -P8 sh -c 'ssh -T "$1" bash -s < ./hello.bash' sh
hi from server: mulder.mydom.com
hi from server: skinner.mydom.com
hi from server: manny.mydom.com
Detalhes:
-
-n1 -P8
- informaxargs
para receber 1 argumento como entrada e executar 8 instâncias dessh
-
%código%
- isso chama um shell e, em seguida, executa o comando após
sh -c 'ssh -T "$1"
- observe que estamos passando
-c "..."
aqui, para evitar ataques de injeção. -
$1
desativa o pseudo terminal.-T
é o conteúdo do arquivo sendo$1
'ed in.
- isso chama um shell e, em seguida, executa o comando após
-
cat
- os comandos que serão passados parabash -s < ./hello.bash'
-
ssh
- o trailingsh
é o que é passado parash
como o shell a invocar, argumento # 0 (xargs
).