GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Ctrl-c-Handhabung in einer SSH-Sitzung?

Was passiert mit Ctrl, wenn ich eine SSH-Sitzung starte, die einen lang andauernden Befehl ausführt +C (SIGINT) Handhabung?

Ich kann sehen, dass die SSH-Sitzung geschlossen ist, aber ich bin mir nicht sicher, wer zuerst das SIGINT erhält:ist es …

  1. der Remote-Befehl mit langer Laufzeit? Das heißt, (a) der Signal-Handler im Remote-Befehl wird aufgerufen und stoppt den Remote-Befehl, (b) die Shell, die ihn hervorgebracht hat, erkennt, dass der Befehl gestoppt wurde, und stoppt ebenfalls, (c) der Remote-SSHD erkennt, dass die Shell gestoppt wurde, also schließt es die Verbindung

    oder

  2. das lokale ssh empfängt das Signal und schließt die Verbindung.

Ich denke, dass (1) passiert, möchte aber sicher gehen.

Ich bin mir auch nicht sicher, was in diesem Fall mit der Shell-Behandlung von SIGINTs passiert. Zum Beispiel, wenn ich …

ssh remote 'while true ; do sleep 1 ; date ; done'

und Strg +C , dann wird die Remote-Verbindung getrennt. Gibt es eine Möglichkeit, den Remote-Befehl unter einer Shell auszuführen, die nach Ctrl am Leben bleibt +C ? Das heißt, in diesem Fall die Schleife beenden und mir erlauben, weiter an der Remote-Shell zu arbeiten?

Akzeptierte Antwort:

ssh kann auf verschiedene Arten aufgerufen werden, die jeweils zu einer etwas anderen Behandlung von Terminal-initiierten Signalen wie Strg-C führen .

  • ssh remotehost führt eine interaktive Sitzung auf remotehost aus . Auf der Clientseite ssh wird versuchen, das von stdin verwendete tty auf den „raw“-Modus und sshd zu setzen auf dem entfernten Host weist ein Pseudo-TTY zu und führt Ihre Shell als Login-Shell aus (z. B. -bash ).

    Das Einstellen des Raw-Modus bedeutet, dass Zeichen, die normalerweise Signale senden würden (wie Strg-C und Strg- ) werden stattdessen einfach in den Eingabestream eingefügt. ssh sendet solche Zeichen unverändert an den entfernten Host, wo sie wahrscheinlich SIGINT oder SIGQUIT senden und normalerweise jeden Befehl beenden und Sie zu einer Shell auf dem entfernten Host zurückbringen. Die ssh-Verbindung bleibt aktiv, solange die Remote-Shell aktiv ist.

  • ssh -t remotehost command args ... führt eine interaktive Sitzung auf remotehost aus , genau wie oben, außer auf der entfernten Seite, your_shell -c "command args ..." wird ausgeführt. Wie oben, wenn Sie Strg-C eingeben , wird es an den Remote-Host gesendet, wo der Befehl wahrscheinlich SIGINT empfängt und sofort beendet wird, und dann wird die Remote-Shell beendet. Die entfernte sshd schließt dann die Verbindung und ssh meldet Connection to remotehost closed.

  • ssh remotehost command args ... führt eine nicht interaktive Sitzung auf remotehost aus . Auf der Clientseite ssh wird nicht setze das tty in den Raw-Modus (naja, außer um ein Passwort oder eine Passphrase einzulesen). Wenn Sie Strg-C eingeben , ssh wird SIGINT gesendet und sofort beendet, ohne auch nur ein Connection to remotehost closed auszugeben Nachricht.

    Die your_shell -c "command args ..." Prozesse werden wahrscheinlich weiterhin auf dem Remote-Host ausgeführt . Entweder beenden sie sich von selbst, oder ein Prozess versucht, Daten in den jetzt geschlossenen ssh-Socket zu schreiben, was dazu führt, dass ein (typischerweise) fatales SIGPIPE-Signal an ihn gesendet wird.

Verwandte:Wie leert man den Magento 1.9.x-Cache mit SSH?
Linux
  1. 5 Möglichkeiten, um Remote-SSH-Sitzungen und -Prozesse nach der Trennung am Laufen zu halten

  2. Remote-SSH-Zugriff zulassen?

  3. So senden Sie Daten von einer Remote-SSH-Sitzung an die lokale Zwischenablage

  4. Übergeben von Variablen im Remote-SSH-Befehl

  5. VPN-Tunnel für den SSH-Fernzugriff

So führen Sie SSH in ein bestimmtes Verzeichnis unter Linux aus

Ausführen von Befehlen auf Remote-Linux-Systemen über SSH

SSHFS:Mounten eines Remote-Dateisystems über SSH

So führen Sie eine Remote-Linux-Sicherung mit SSH durch

So verwenden Sie SSH, um eine Verbindung zu einem Remote-Server herzustellen

Gewusst wie:FreeBSD-Fernverwaltung