Você pode usar
#!/bin/bash
FILE=$1
exec 3<$FILE
while read -u 3 host; do
$2 $host $3
done
Então, se você tiver:
$ cat /tmp/hostnames
some.host1.com
another.host2.net
some.host3.org
some.host4.com
e execute dofor.sh /tmp/hostnames ssh ls
, ele será executado em sequência:
ssh some.host1.com ls
ssh another.host2.net ls
ssh some.host3.org ls
ssh some.host4.com ls
EDIT1:
Se você quiser alterar ssh
ou ls
em alguns comandos mais longos (ou partes deles), basta usar aspas:
dofor.sh /tmp/hostnames "ssh -p 23" "ls -lh /"
EDIT2:
Com o script a seguir, você poderá usar a variável $host
em quantos lugares desejar, em seu comando:
#!/bin/bash
exec 3<$1
while read -u 3 host; do
eval $2
done
(Eu fiz este mais curto - sem introdução inútil da variável $FILE
.)
A parte importante aqui é que você precisa usar aspas simples ao redor do comando que contém a variável $ host:
dofor.sh /tmp/hostnames 'echo "trying $host :"; ssh -p 23 myuser@$host "ls -lh /"'
Mas cuidado que é perigoso usar eval
(veja parede do l0b0 ) porque se o arquivo /tmp/hostnames
continha um comando em alguma linha, ele seria executado. Melhor não usar isso como root
!