it-swarm.com.de

Wie mache ich ssh mit einem Timeout in einem Skript?

Ich führe ein Skript aus, das über kennwortloses SSH auf einem Remote-Host eine Verbindung herstellt. Ich möchte eine Zeitüberschreitung festlegen, damit ich, wenn der Remote-Host unendlich viel Zeit für die Ausführung benötigt, aus dieser ssh-Sitzung herauskomme und andere Zeilen in meinem sh-Skript fortsetze.

Irgendeine Idee, wie es geht?

146
user57421
ssh -o ConnectTimeout=10  <hostName>

Wobei 10 die Zeit in Sekunden ist.

249
user57421

Verwenden Sie die -o ConnectTimeout und -o BatchMode=yes -o StrictHostKeyChecking=no.

ConnectTimeout verhindert das Hängen des Skripts, BatchMode verhindert das Hängen des Skripts mit Host unknown, YES zum Hinzufügen zu known_hosts und StrictHostKeyChecking fügt den Fingerabdruck automatisch hinzu.

**** HINWEIS **** Das "StrictHostKeyChecking" war nur für interne Netzwerke gedacht, in denen Sie Ihren Hosts vertrauen. Abhängig von der Version des SSH-Clients kann die Meldung "Möchten Sie wirklich Ihren Fingerabdruck hinzufügen?" Dazu führen, dass der Client auf unbestimmte Zeit hängt (hauptsächlich alte Versionen, die unter AIX ausgeführt werden). Die meisten modernen Versionen leiden nicht unter diesem Problem. Wenn Sie mit Fingerabdrücken bei mehreren Hosts umgehen müssen, empfehle ich, die Datei known_hosts mit einem Konfigurationsverwaltungstool wie puppet/ansible/chef/salt/etc. Zu verwalten.

100
Doug

versuche dies:

timeout 5 ssh [email protected]

timeout führt den Befehl ssh aus (mit args) und sendet ein SIGTERM, wenn ssh nach 5 Sekunden nicht zurückkehrt. Weitere Informationen zum Timeout finden Sie in diesem Dokument: http://man7.org/linux/man-pages/man1/timeout.1.html

oder Sie können den Parameter von ssh verwenden:

ssh -o ConnectTimeout=3 [email protected]
42
Lee HoYo

Wenn alles andere fehlschlägt (einschließlich des fehlenden Befehls timeout), funktioniert das Konzept in diesem Shell-Skript:

 #!/bin/bash
 set -u
 ssh $1 "sleep 10 ; uptime" > /tmp/outputfile 2>&1 & PIDssh=$!
 Count=0
 while test $Count -lt 5 && ps -p $PIDssh > /dev/null
 do
    echo -n .
    sleep 1
    Count=$((Count+1))
 done
 echo ""

 if ps -p $PIDssh > /dev/null
 then
    echo "ssh still running, killing it"
    kill -HUP $PIDssh
 else
    echo "Exited"
 fi
0
Philip Kearns

Nun, Sie könnten Nohup verwenden, um alles auszuführen, was Sie im "nicht blockierenden Modus" ausführen. Sie können also einfach weiter prüfen, ob das, was ausgeführt werden soll, ausgeführt wird oder ansonsten beendet wird.

 Nohup ./my-script-that-may-take-long-to-finish. ____.]
 
 echo "Das Skript wurde am 15. Februar 2011 um 9:20 Uhr beendet"> /tmp/done.txt

Im zweiten Fall prüfen Sie einfach, ob die Datei vorhanden ist.

0
Eduardo