Remote-For-Loop über SSH


11

Ich habe folgendes in einem Skript

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

Aber es funktioniert nicht. Seltsame Sache, ich sehe $ I Anzahl der Rückleitungen. Wenn ich also zehn Dateien habe, sehe ich zehn leere Zeilen.


Schauen Sie sich auch die --sshlogin Option von GNU Parallel an .
Sebastian

Antworten:


19

Ihre lokale Shell interpretiert das ${i}innerhalb von doppelten Anführungszeichen ( "), sodass der Befehl wie folgt funktioniert

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

Verwenden Sie 'stattdessen einfach einfache Anführungszeichen ( ) und Ihr Problem verschwindet:

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

1

Ich bin gerade vor einiger Zeit auf dieses Problem gestoßen, und die angegebene Lösung, obwohl sie funktioniert, ist nicht allzu effektiv, wenn Sie auch Variablen aus der lokalen Shell abrufen, bevor Sie mit ssh ein Array erstellen, über das Sie iterieren können. Etwas chaotischer wäre es, zunächst nur dem $ zu entkommen, also wäre es so

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

Welches würde es innerhalb des lokalen Konstrukts entkommen, nicht die aufgerufene ssh-Shell.


0

Ich habe die obige Antwort aktualisiert, um auch Ports aus einer Liste zu erhalten.

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.