Boucle à distance via SSH

12

J'ai ce qui suit dans un script

for server in ${servers[@]}; do
    echo ${server}
    ssh user@${server} "for i in /tmp/foo* ; do echo ${i}; done"
done

Mais ça ne marche pas. Chose bizarre, je vois $ I montant de lignes de retour. Donc, si j'ai dix fichiers, je vois dix lignes vides.

Eldelshell
la source
regardez aussi l' --sshlogin option de GNU Parallel .
Sebastian

Réponses:

19

Votre shell local interprète les ${i}guillemets doubles ( "), de sorte que la commande fonctionne pour

ssh user@some.serv.er "for i in /tmp/foo* ; do echo; done"

Utilisez simplement des guillemets simples ( ') à la place et votre problème disparaîtra:

ssh user@${server} 'for i in /tmp/foo* ; do echo $i; done'

la source
1

Je suis juste tombé sur ce problème un peu en arrière, et la solution donnée, même si cela fonctionne, n'est pas trop efficace si vous extrayez également des variables du shell local, avant le ssh, vous créez un tableau pour itérer. Un peu plus compliqué serait d'échapper au $ au départ, donc ce serait

"for i in /tmp/foo* ; do echo \${i}; done"

Ce qui lui échapperait dans la construction locale, pas le shell ssh appelé.

LP
la source
0

J'ai également mis à jour la réponse ci-dessus pour obtenir des ports à partir d'une liste.

for i in {10.21.xxx.yyy,10.21.xxx.yyy,10.23.xxx.yyy};
do
        for j in {5501,5502,5503,5504,7701,7702,7703,7704,5551,5552,5553,7771,7772,7773};
        do
                (echo > /dev/tcp/${i}/${j}) > /dev/null 2>&1 && echo "${i}:${j} :: it's getting connected" || echo "${i}:${j} :: it's not connecting"
        done
done
Anand Varkey Philips
la source