Remoto for-loop sobre SSH


12

Tengo lo siguiente en un script

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

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


mira también la --sshlogin opción de GNU Parallel .
Sebastian

Respuestas:


19

Su shell local interpreta las ${i}comillas dobles ( "), por lo que el comando funciona para

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

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

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

1

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 estás extrayendo variables del shell local, antes del ssh creas 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 del shell ssh llamado.


0

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.