Wie führe ich viele SSH remote-Befehle, die auf mehreren Maschinen, in batch?
Ich SSH verwenden, um einige Befehle auf mehreren remote-Rechnern in ein for
Schleife. Es führt der gleiche Befehl(en) für eine Liste der IP-Adressen. Einige der IP-Adressen möglicherweise nicht erreichbar sein, so habe ich das ConnectTimeout
option.
Allerdings, mein script hat nicht funktioniert, wie ich wollte. Eigentlich ist es geklebt an den ersten nicht-erreichbar-IP anstatt aufzugeben und zu versuchen mit der nächsten IP-Adresse auf meiner Liste.
Hier ist der relevante Teil meines scripts:
for ip in ${IP} ; do
ssh -o BatchMode=yes \
-o StrictHostKeyChecking=no \
-o ConnectTimeout=10 \
-l ${USERNAME} \
${SCRIPT_HOST} \
"${COMMAND} -i $ip || echo timeout" \
>> ./myscript.out
done
Es ist in Ordnung, die für die IPs erreichbar, aber wenn eine bestimmte IP-down ist, wartet er eine Weile (viel mehr als 10s, vielleicht 35-40 Sekunden) und zeigt eine Fehlermeldung an meinem terminal:
ERROR connecting : Connection timed out
So Frage ich mich, welche option habe ich nicht richtig verwenden.
<your command> 2>/dev/null
Haben Sie versucht, die Ausführung des ssh im debug-Modus (also verbose-Modus)?
InformationsquelleAutor JavaRed | 2013-11-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Nutzung der
ConnectTimeout
richtig ist, so ist es nicht ersichtlich, warum es nur mal nach 30 oder mehr Sekunden.Hier ist, wie würde ich ändern Sie Ihr Skript, um zu vermeiden, die timeout-problem vollständig:
parallel
Verbindung zu mehr als einem Ziel-host in der gleichen Zeit.-f
option, um SSH-Prozess in den hintergrund.Hier ist eine Lösung mit GNU parallel, die laufen bei den meisten 50 verbindungen gleichzeitig:
parallel <command> ::: <arguments>
ausgeführt wird<command> <argument>
viele Male parallel durch die Spaltung der<arguments>
Liste. Der Platzhalter für<argument>
ist{}
.Verwenden
parallel --jobs n
begrenzen Sie die Zahl der parallelen verbindungen.InformationsquelleAutor
Den Verbindungs-timeout ist, wenn Sie bereits eine Verbindung hergestellt, und wenn die Verbindung bleibt im Leerlauf für die Zeit in Sekunden, dann wird es trennen (wenn Sie nicht aktiviert auch die KEEP_ALIVE ssh-parameter, die verhindern, dass eine Verbindung immer ab Leerlauf).
Dem Grund dauert es 30 Sekunden, bevor Sie sich ein time-out ist, weil es das TCP-Protokoll-interne timer, die versuchen, eine Verbindung für die Höhe der Zeit und der Rückkehr, dass die Fehlermeldung dass er keine Verbindung zum sftp-server. Ist es nicht kommt von ssh.
ssh_config(5)
Handbuch Seite über dieConnectTimeout
option: "Gibt den timeout (in Sekunden) verwendet, wenn eine Verbindung zu einem SSH-server, anstelle der Verwendung der Standard-system-TCP-timeout. Dieser Wert wird nur verwendet, wenn das Ziel down ist oder wirklich nicht erreichbar ist, nicht, wenn es nicht die Verbindung."InformationsquelleAutor