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 remotehost
führt eine interaktive Sitzung aufremotehost
aus . Auf der Clientseitessh
wird versuchen, das von stdin verwendete tty auf den „raw“-Modus undsshd
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 aufremotehost
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 entferntesshd
schließt dann die Verbindung undssh
meldetConnection to remotehost closed.
-
ssh remotehost command args ...
führt eine nicht interaktive Sitzung aufremotehost
aus . Auf der Clientseitessh
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 einConnection 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.