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 …
-
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
-
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 remotehostführt eine interaktive Sitzung aufremotehostaus . Auf der Clientseitesshwird versuchen, das von stdin verwendete tty auf den „raw“-Modus undsshdzu 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.
sshsendet 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 aufremotehostaus , 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 entferntesshdschließt dann die Verbindung undsshmeldetConnection to remotehost closed. -
ssh remotehost command args ...führt eine nicht interaktive Sitzung aufremotehostaus . Auf der Clientseitesshwird nicht setze das tty in den Raw-Modus (naja, außer um ein Passwort oder eine Passphrase einzulesen). Wenn Sie Strg-C eingeben ,sshwird SIGINT gesendet und sofort beendet, ohne auch nur einConnection to remotehost closedauszugeben 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.