Zdalna pętla for przez SSH

12

Mam w skrypcie następujące elementy

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

Ale to nie działa. Dziwne, widzę $ I linii zwrotu. Więc jeśli mam dziesięć plików, widzę dziesięć pustych linii.

Eldelshell
źródło
spójrz także na opcję GNU Parallel --sshlogin .
Sebastian

Odpowiedzi:

19

Lokalna powłoka interpretuje ${i}podwójne cudzysłowy ( "), więc polecenie działa

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

'Zamiast tego użyj pojedynczego cudzysłowu ( ), a Twój problem zniknie:

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

źródło
1

Właśnie natknąłem się na ten problem nieco wstecz, a podane rozwiązanie, podczas gdy działa, nie jest zbyt skuteczne, jeśli pobierasz zmienne z lokalnej powłoki, przed ssh tworzysz tablicę do iteracji. Nieco bardziej niechlujnym byłoby po prostu uciec od $ początkowo, tak by było

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

Który uciekłby z niego w obrębie lokalnej konstrukcji, a nie zwanej powłoką ssh.

LP
źródło
0

Zaktualizowałem powyższą odpowiedź, aby uzyskać porty również z listy.

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
źródło