PuTTy SSH-Sitzung von Signal 2 beendet

0

Wenn ich über ssh eine Verbindung zu einem Computer herstelle, kann ich die Kombination "Strg + C" nicht verwenden, da sie ein Kill-Signal an die Sitzung sendet.

Als Beispiel starte ich eine SSH-Sitzung zum Clientcomputer vom Hauptcomputer aus, führe auf dem Client den Befehl "top" aus, und wenn ich "top" beenden möchte, verwende ich die Kombination "Strg + C" und die SSH-Sitzung wird geschlossen. Die Ausgabe dieses Prozesses lautet wie folgt:

[root@client ~]# top             //I use Ctrl + C to exit from top
[root@main ~]# Killed by signal 2.

"ssh -vvv" Ausgabe:

Last login: Tue Feb 13 14:08:57 2018 from main.company.intra
[root@client ~]# debug3: send packet: type 1
debug1: channel 0: free: client-session, nchannels 1
debug3: channel 0: status: The following connections are open:
  #0 client-session (t4 r0 i0/0 o0/0 fd 4/5 cc -1)

Killed by signal 2.
[root@main ~]#

Wenn ich MobaXterm für ssh ausprobiere, gibt es kein Problem. Das Problem betrifft also nicht die Serverkonfiguration, sondern die PuTTy-Konfiguration.

Ich denke, während ich MobaXterm benutze, wurde die Tastenkombination Strg + C an den Client-Server gesendet, während mit PuTTy das Interrupt-Signal an den Hauptserver gesendet wurde (also der SSH-Verbindungsprozess). Ich denke schon, wenn wir diese Route reparieren, ist das Problem gelöst.

Gefolge
quelle
2
Ich denke, wenn du schlägst Qoder qoben stehst, verlässt du es. Hast du es versucht ?
C0deDaedalus
Ja. Es tut uns leid. Ich möchte nur ein Beispiel geben. Nicht nur "top" Ich benutze Strg + C, um manchmal einen Prozess abzubrechen.
Gefolge

Antworten:

1

Ich kann die Kombination "Strg + C" nicht verwenden, da sie ein Kill-Signal an die Sitzung sendet.

Ctrl+ Csoll normalerweise ein Interrupt-Signal senden . Das Interruptsignal ist Signal 2. Es tut also, was beabsichtigt war.

Killed by signal 2

Diese Meldung wird normalerweise nicht angezeigt, ist aber ganz richtig. Der Prozess beendet , da es ein Signal 2, das empfangene Unterbrechungssignal erzeugt wird durch +SIGINTCtrlC


Lassen Sie uns zuerst sehen, welche Tastenkombination dem Interrupt-Signal entspricht

$ stty -a | grep intr
intr = ^C

Überprüfen wir nun den numerischen Wert des Interruptsignals

$ man 7 signal
...
Signal     Value     Action   Comment
-----------------------------------------------------------------------
SIGHUP        1       Term    Hangup detected on controlling terminal
                              or death of controlling process
SIGINT        2       Term    Interrupt from keyboard
SIGQUIT       3       Core    Quit from keyboard
SIGFPE        8       Core    Floating point exception
SIGKILL       9       Term    Kill signal
SIGSEGV      11       Core    Invalid memory reference

Beachten Sie, dass das KILL-Signal das Signal 9 (nicht 2) ist. Sie können jedes dieser Signale mit dem killBefehl senden, aber nur eines davon ist ein KILL-Signal und es ist kein Signal 2.


Es bleibt also die Frage, was diese Nachricht "Getötet durch Signal 2" erzeugt.

Wenn wir uns https://stackoverflow.com/questions/3165511/how-to-make-terminal-not-print-killed-by-signal-2-on-catching-a-sigint anschauen , sehen wir, dass diese Nachricht erzeugt werden kann Wenn Sie über ein Skript verfügen, mit trap SIGINTdem Signale abgefangen und spezielle Aktionen ausgeführt werden.

Vielleicht haben Sie einen topAlias ​​oder ein topSkript früher $PATHals /usr/bin?

$ type top
top is /usr/bin/top

Sie schlagen vor, dass eine SSH-Sitzung von * nix Computer mainzu * nix Computer beendet clientwird. Sie werden an einer * nix-Shell-Eingabeaufforderung weitergeleitet.

Aus Ihrer Erwähnung von MobaXterm als Alternative zu PuTTY schließe ich, dass Sie die Windows-Version von PuTTY verwenden, nicht die * nix-Version von PuTTY. Wenn ja, ist nicht klar, warum Ihre SSH-Verbindung aus zwei Teilen besteht (Win-PC -> "main" -> "client").

Wenn Sie PuTTY verwenden, um sich bei main anzumelden, und sich dann bei sshclient anzumelden, ist es nicht besonders überraschend, dass PuTTYs ^ C von main behandelt und nicht an client für übergeben wird top.

Wir können auf https://unix.stackexchange.com/questions/102061/ctrl-c-handling-in-ssh-session verweisen, in dem dieses Thema behandelt wird.

ssh remotehostFührt eine interaktive Sitzung auf RemoteHost durch. Auf der Clientseite versucht ssh, das von stdin verwendete tty auf "raw" zu setzen, und sshd weist auf dem Remote-Host ein Pseudo-tty zu und führt Ihre Shell als Login-Shell aus (z. B. -bash).

Wenn Sie den Raw-Modus einstellen, werden Zeichen, die normalerweise Signale senden würden (z. B. Strg-C und Strg-), 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 remotehost command args ...Führt eine nicht interaktive Sitzung auf Remotehost aus. Auf der Clientseite setzt ssh das tty nicht auf den Raw-Modus (außer zum Einlesen eines Passworts oder einer Passphrase). Wenn Sie Ctrl-C eingeben, wird ssh mit SIGINT gesendet und sofort beendet, ohne dass eine Verbindung zum Remotehost hergestellt wird.

Ich vermute also, dass Ihre PuTTY-Sitzung anders konfiguriert ist als Ihre MobaXterm-Sitzung und dass einige Dinge im Gange sind, von denen Sie (und daher auch wir) nichts wissen.

PuTTY sendet kein Signal, sondern ein ASCII-Steuerzeichen. Dies ist leicht zu beweisen. Wir bitten die Shell nur, das ASCII-Steuerzeichen 0x03 (ETX, Strg + C) von der Shell nicht speziell zu behandeln und dann zu prüfen, was PuTTY sendet:

$ stty intr ^A
$ cat -v
I will now press Ctrl + C ^C
I will now press Ctrl + A
$ $ echo $?
130

Siehe http://tldp.org/LDP/abs/html/exitcodes.html 130 = 128 + 2 = Signal 2. In diesem Fall habe ich ^ A verwendet, um 0x01 an die Shell zu senden, die Signal 2 an den topProzess gesendet hat. ^ C hat gerade 0x03 gesendet, was cat-Vals ^ C angezeigt wird .

Ich würde also NICHT versuchen herauszufinden, warum Putty SIGINTR "sendet", wenn mobaXterm dies nicht tut. Keiner von ihnen tut das. Sie senden nur ein ASCII-Steuerzeichen.


Schauen Sie sich an, wie Sie PuTTY aufrufen. Klicken Sie dazu auf ein Desktopsymbol. Verfügt dieses Symbol über Eigenschaften (Alt + Eingabetaste) mit zusätzlichen Parametern in Target? usw. usw.

RedGrittyBrick
quelle
Eigentlich geht es bei dem Problem nicht um Spitze. Es geht um jeden Interrupt, den ich benutze. Wenn ich einen falschen Befehl eingebe und Strg + C benutze, um das aufzugeben, verliere ich meine SSH-Verbindung. Ich denke, während ich MobaXterm benutze, wurde Strg + C an den Client-Server gesendet, während PuTTy das Interrupt-Signal an gesendet hat Hauptserver (also der ssh Verbindungsprozess). Ich denke schon, wenn wir diese Route reparieren, ist das Problem gelöst.
Gefolge
1
@Gefolge: Das Signal wird immer an main übergeben. Die Frage ist, wie der Prozess auf main dieses Signal handhabt. Das hängt davon ab, wie genau dieser Prozess aufgerufen wurde, und davon, ob Aliase und Skripte (sowohl auf der Haupt- als auch auf der Client-Seite) vorhanden sind. zB hat main vielleicht ein Top-Skript, das ssh client topaus irgendeinem Grund ausgeführt wird?
RedGrittyBrick