Strg-C-Behandlung in der SSH-Sitzung

20

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 ...

  1. 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

  2. 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.

ttsiodras
quelle
3
Ein nicht interaktives ssh ( ssh remote commandim Gegensatz zu ssh 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 Sie ssh remote.
Mark Plotnick
@MarkPlotnick: OK Mark - wenn Sie Ihre Antwort unten als Antwort hinzufügen, werde ich sie akzeptieren ... In meinen eigenen Tests habe ich überprüft, dass die Fernbedienung kein Signal empfängt.
Ttsiodras

Antworten:

23

sshkann auf einige unterschiedliche Arten aufgerufen werden, wobei sich jeweils eine geringfügig unterschiedliche Behandlung von terminal initiierten Signalen wie z Ctrl-C.

  • ssh remotehoststartet eine interaktive Sitzung am remotehost. Versucht auf der Client-Seite, sshdas von stdin verwendete tty auf "raw" zu setzen, und weist sshdauf 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. sshsendet 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ühren remotehost, auf der genau wie oben, außer auf der Remote-Seite, ausgeführt your_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 Fernbedienung sshdschließt dann die Verbindung und sshmeldet sichConnection to remotehost closed.

  • ssh remotehost command args ...Führt eine nicht interaktive Sitzung am aus remotehost. Auf der Clientseite sshwird das tty nicht auf den Raw-Modus gesetzt (außer zum Einlesen eines Passworts oder einer Passphrase). Wenn Sie eingeben Ctrl-C, sshwird SIGINT gesendet und sofort beendet, ohne dass eine Connection to remotehost closedNachricht 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.

Mark Plotnick
quelle
1
Technisch gesehen schreibt der Remote-Befehl nicht direkt in den Socket. Sein Standard ist eine Pfeife. Und sshd am anderen Ende liest die Daten, verschlüsselt sie und sendet sie über den Socket. Das Endergebnis ist jedoch dasselbe. Der Befehl erhält eine Sigpipe, da diese Pipe nicht mehr vorhanden ist, wenn der Client die Verbindung trennt.
Stéphane Chazelas
@ StéphaneChazelas Danke, ich werde die Antwort bearbeiten, um sie zu korrigieren.
Mark Plotnick