Was passiert mit der Behandlung von Ctrl+ C(SIGINT), wenn ich eine SSH-Sitzung starte, in der ein Befehl mit langer Laufzeit ausgeführt wird ?
Ich kann sehen, dass die SSH-Sitzung geschlossen ist, aber ich bin nicht sicher, wer zuerst den SIGINT erhält: Ist es ...
der ferngesteuerte Langzeitbefehl? Das heißt, (a) der Signal-Handler im Remote-Befehl wird aufgerufen und stoppt den Remote-Befehl. (b) die Shell, die den Befehl erzeugt hat, erkennt, dass der Befehl gestoppt wurde. (c) der Remote-SSHD erkennt, dass die Shell gestoppt wurde. so schließt es die Verbindung
oder
Der lokale SSH empfängt das Signal und beendet die Verbindung.
Ich denke, dass (1) passiert, aber ich möchte sicher gehen.
Ich bin mir auch nicht sicher, was in diesem Fall mit dem Shell-Handling von SIGINTs passiert. Zum Beispiel, wenn ich ...
ssh remote 'while true ; do sleep 1 ; date ; done'
und Ctrl+ C, dann wird die Fernverbindung getrennt. Gibt es eine Möglichkeit, den Remote-Befehl unter einer Shell auszuführen, die nach Ctrl+ am Leben bleibt C? Stoppen Sie in diesem Fall die Schleife und lassen Sie mich an der Remote-Shell weiterarbeiten.
ssh remote command
im Gegensatz zussh remote
) wird (auf der lokalen Seite) durch den SIGINT getötet, der durch Eingabe von Strg-C generiert wird. Die Remote-Seite wird wahrscheinlich (abhängig vom Betriebssystem) so lange ausgeführt, bis versucht wird, in den geschlossenen Socket zu lesen oder zu schreiben. Wenn Sie möchten, dass alle Tastenanschläge, einschließlich Strg-C, an die Fernbedienung weitergeleitet werden, verwenden Siessh remote
.Antworten:
ssh
kann auf einige unterschiedliche Arten aufgerufen werden, wobei sich jeweils eine geringfügig unterschiedliche Behandlung von terminal initiierten Signalen wie z Ctrl-C.ssh remotehost
startet eine interaktive Sitzung amremotehost
. Versucht auf der Client-Seite,ssh
das von stdin verwendete tty auf "raw" zu setzen, und weistsshd
auf dem Remote-Host ein Pseudo-tty zu und führt Ihre Shell als Login-Shell aus (z-bash
. B. ).Wenn Sie den Raw-Modus einstellen, werden Zeichen, die normalerweise Signale senden (wie z. B. Ctrl-Cund Ctrl-\), nur in den Eingabestream eingefügt.
ssh
sendet solche Zeichen so wie sie sind an den Remote-Host, wo sie wahrscheinlich SIGINT oder SIGQUIT senden und in der Regel jeden Befehl beenden und Sie zu einer Shell auf dem Remote-Host zurückkehren. Die SSH-Verbindung bleibt bestehen, solange die Remote-Shell aktiv ist.ssh -t remotehost command args ...
wird eine interaktive Sitzung ausführenremotehost
, auf der genau wie oben, außer auf der Remote-Seite, ausgeführtyour_shell -c "command args ..."
wird. Wenn Sie wie oben angeben Ctrl-C, wird es an den Remote-Host gesendet, wo der Befehl wahrscheinlich SIGINT empfängt und sofort beendet wird. Anschließend wird die Remote-Shell beendet. Die Fernbedienungsshd
schließt dann die Verbindung undssh
meldet sichConnection to remotehost closed.
ssh remotehost command args ...
Führt eine nicht interaktive Sitzung am ausremotehost
. Auf der Clientseitessh
wird das tty nicht auf den Raw-Modus gesetzt (außer zum Einlesen eines Passworts oder einer Passphrase). Wenn Sie eingeben Ctrl-C,ssh
wird SIGINT gesendet und sofort beendet, ohne dass eineConnection to remotehost closed
Nachricht ausgegeben wird.Die
your_shell -c "command args ..."
Prozesse werden wahrscheinlich weiterhin auf dem Remote-Host ausgeführt . Entweder werden sie selbst beendet, oder ein Prozess versucht, Daten in den jetzt geschlossenen ssh-Socket zu schreiben, wodurch ein (normalerweise) schwerwiegendes SIGPIPE-Signal an ihn gesendet wird.quelle