Ich führe ein Skript aus, das über SSH ohne Kennwort auf einem Remote-Host eine Verbindung herstellt. Ich möchte ein Zeitlimit festlegen, damit ich, wenn die Ausführung des Remote-Hosts unendlich lange dauert, aus dieser SSH-Sitzung herauskomme und andere Zeilen in meinem SH-Skript fortsetze.
Irgendeine Idee, wie es geht?
ssh
Sitzung zu bleiben " (Frage "Wie kann das Zeitlimit für SSH-Verbindungen erhöht werden?"), Ist dies der falsche Ort . Die Antwort ist unter diesem Link über ssh-timeout .Antworten:
Wobei 10 Zeit in Sekunden ist. Dieses Zeitlimit gilt nur für die Erstellung der Verbindung.
quelle
Verwenden Sie das
-o ConnectTimeout
und-o BatchMode=yes -o StrictHostKeyChecking=no
.ConnectTimeout verhindert, dass das Skript hängt, BatchMode verhindert , dass es mit unbekanntem Host hängt, JA, um es zu bekannten_Hosts hinzuzufügen, 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 der Client unter "Sind Sie sicher, dass Sie Ihren Fingerabdruck hinzufügen möchten" auf unbestimmte Zeit hängen bleiben (hauptsächlich alte Versionen, die unter AIX ausgeführt werden). Die meisten modernen Versionen leiden nicht unter diesem Problem. Wenn Sie mit Fingerabdrücken mit mehreren Hosts arbeiten müssen, empfehle ich, die Datei unknown_hosts mit einem Konfigurationsmanagement-Tool wie Puppet / Ansible / Chef / Salt / etc. Zu verwalten.
quelle
-o StrictHostKeyChecking=no
Die Frage wird nicht nur nicht beantwortet, es ist auch eine schreckliche Idee, wenn Sie sich um Sicherheit kümmern. Dies könnte der Grund sein, warum Sie SSH überhaupt verwenden.StrictHostKeyChecking=no
wenn Sie sich überhaupt um Sicherheit kümmern. @Doug: Das Skript hängt nicht - es besteht nur darauf, dass Sie beim ersten Mal manuell zum Remote-Host ssh, damit es den Host kennenlernt. Aber es schützt Sie vor MITM-Angriffen. Bitte bearbeiten Sie diese Antwort, um dies widerzuspiegeln, da es sich derzeit um einen sehr gefährlichen Rat handelt. Und es wurde nicht einmal danach gefragt.Versuche dies:
timeout führt den Befehl ssh (mit Argumenten) aus 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:
quelle
brew install coreutils
und verwenden Sie ihngtimeout
(Quelle: stackoverflow.com/questions/3504945/timeout-command-on-mac-os-x ).timeout 3s ssh user@server 'sleep 5; echo blarg >> /tmp/blarg'
Dies beendet den Prozess auf der SSH-Clientseite, aber / tmp / blarg wird auf dem Remote-Server immer noch geändert. Dies bedeutet, dass Sie Prozesse verlieren, wenn Sie einen außer Kontrolle geratenen CPU-intensiven Job auf dem Remote-Server ausführen.Sie können sich auch mit flag verbinden
Daher sendet der SSH-Client jede<secs>
Sekunde ein Nullpaket an den Server , um die Verbindung aufrechtzuerhalten. Unter Linux kann dies auch global in/etc/ssh/ssh_config
oder pro Benutzer in festgelegt werden~/.ssh/config
.quelle
Wenn alles andere fehlschlägt (einschließlich des Fehlens des
timeout
Befehls), funktioniert das Konzept in diesem Shell-Skript:quelle
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 alles, was ausgeführt werden soll, ausgeführt oder ansonsten beendet wurde.
Im zweiten Fall überprüfen Sie einfach, ob die Datei vorhanden ist.
quelle