it-swarm-es.tech

Remoto for-loop sobre SSH

Tengo lo siguiente en un script

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

Pero no funciona. Cosa rara, veo $ I cantidad de líneas de devolución. Entonces, si tengo diez archivos, veo diez líneas en blanco.

12
Eldelshell

Su Shell local interpreta el ${i} entre comillas dobles ("), entonces el comando funciona para

ssh [email protected] "for i in /tmp/foo* ; do echo; done"

Simplemente use comillas simples (') y su problema desaparecerá:

ssh [email protected]${server} 'for i in /tmp/foo* ; do echo $i; done'
19
user601

Acabo de encontrarme con este problema un poco atrás, y la solución dada, si bien funciona, no es demasiado efectiva si también extrae variables del Shell local, antes del ssh crea una matriz para iterar. Un poco más complicado sería escapar de los $ inicialmente, por lo que sería

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

Lo cual se escaparía dentro de la construcción local, no el llamado ssh Shell.

1
L.P.

He actualizado la respuesta anterior para obtener puertos de una lista también.

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
0