So legen Sie eine SSH-Zeitdauer fest und leiten die Fehlermeldung um

So legen Sie eine SSH-Zeitdauer fest und leiten die Fehlermeldung um

Ich habe eine Hostliste mit mehreren Hosts. Ich möchte SSH verwenden, um eine Verbindung zu ihnen herzustellen. Anhand der Dauer von SSH möchte ich sehen, ob der Host verfügbar ist oder nicht. Wenn es länger als 5 Sekunden dauert (was bedeutet, dass er nicht verfügbar ist), dann halte es an und stelle per SSH eine Verbindung zum nächsten Host her. Sobald ein Host verfügbar ist, wird der Name des Hosts ausgegeben. Ich habe zuvor Nmap verwendet, aber die IT-Sicherheit hat mir mitgeteilt, dass die Installation auf dem Desktop auf dem Campus nicht zulässig ist.

HOSTS=`cat $host_list`
for line in $HOSTS
do 
ssh -o ConnectTimeout=5s $line true >> /dev/null
RESULT=$?
if [ $RESULT -eq 0 ]
then
echo $line > succeed.txt
else
echo $line > fail.txt
fi
done

Das obige Skript ist alles, was ich tun kann. Das Problem ist, dass ich die Fehlermeldung umleiten möchte, wenn es fehlschlägt ssh: connect to host c28-0112-05.ad.mtu.edu port 22: No route to host. Aber ich erhalte immer noch die Fehlermeldung.

Antwort1

Nah genug:

timeout -5s "ssh $line true"

Das ist:

  1. Verwenden Sie die korrekten Anführungszeichen. timeout `ssh …`kann hier unmöglich funktionieren, da es bedeutet: „Führen Sie ‚ssh‘ aus, erfassen Sie die Ausgabe,Danngeben Sie die Ausgabe an ‚Timeout‘ aus.“

  2. Führen Sie ssh im „Batch“-Modus aus, das heißt, geben Sie ihm einen Befehl zum Ausführen. Ohne diesen Befehl wird ssh im interaktiven Modus ausgeführt und bleibt auch bei erfolgreichen Verbindungen für immer hängen.

Sie können auch Folgendes versuchen:

ssh -o ConnectTimeout=5s $line true

Antwort2

ssh verfügt über den -oSchalter, mit dem Sie zusätzliche Optionen angeben können. Besonders nützlich ist hier die ConnectTimeoutOption, die ein in Sekunden angegebenes Argument annimmt:

ssh -o ConnectTimeout=5 123.123.123.123

Darüber hinaus ConnectionAttemptskönnte es auch für Sie nützlich sein.

verwandte Informationen