Когда я подключаюсь к машине через ssh, я не могу использовать комбинацию "Ctrl + C", потому что она посылает сигнал уничтожения сеансу.

Например, я запускаю сеанс SSH на клиентском компьютере с основного компьютера, запускаю команду "top" на клиенте, и когда я хочу выйти из "top", я использую комбинацию «Ctrl + C», и сеанс SSH закрывается. Результат этого процесса:

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

Вывод "ssh -vvv":

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 ~]#

Когда я пробую MobaXterm для ssh, это не проблема. Таким образом, проблема не в конфигурации серверов, а в конфигурации PuTTy.

Я думаю, что пока я использую MobaXterm, Ctrl+C был отправлен на клиентский сервер, а при использовании PuTTy сигнал прерывания был отправлен на главный сервер (так что процесс соединения ssh). Я думаю, что если мы исправим этот путь, проблема будет решена.

1 ответ1

1

Я не могу использовать комбинацию "Ctrl + C", потому что она посылает сигнал на сеанс.

Ctrl + C обычно должен посылать сигнал прерывания. Сигнал прерывания - это сигнал 2. Так что он делает то, что предполагалось.

Killed by signal 2

Это сообщение не то, которое вы обычно видите, но оно совершенно правильно. Процесс завершился, потому что он получил сигнал 2, сигнал прерывания SIGINT генерируемый Ctrl + C


Сначала давайте посмотрим, какая комбинация клавиш соответствует сигналу прерывания

$ stty -a | grep intr
intr = ^C

Теперь давайте проверим числовое значение сигнала прерывания.

$ 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

Обратите внимание, что сигнал KILL - это сигнал 9 (не 2). Вы можете отправить любой из этих сигналов с помощью команды kill но только один из них является сигналом KILL, а не сигналом 2.


Таким образом, остается вопрос, что создает это сообщение "Убит по сигналу 2".

Если мы посмотрим на https://stackoverflow.com/questions/3165511/how-to-make-terminal-not-print-killed-by-signal-2-on-catching-a-sigint, то увидим, что это сообщение может быть создано если у вас есть скрипт, который использует trap SIGINT для перехвата сигналов и выполнения специальной обработки.

Может быть, у вас есть top псевдоним или top скрипт в $PATH чем /usr/bin?

$ type top
top is /usr/bin/top

Вы предлагаете прекратить сеанс SSH с main компьютера * nix на client компьютер * nix. Оставляя вас в приглашении оболочки * nix.

Из вашего упоминания о MobaXterm как об альтернативе PuTTY я могу сделать вывод, что вы используете версию PuTTY для Windows, а не версию * nix для PuTTY. Если так, то не понятно, почему ваше SSH-соединение состоит из двух частей (Win-PC -> "main" -> "client").

Если вы используете PuTTY для входа в main, а затем используете ssh для входа в клиент, не удивительно, что PuTTY ^ C обрабатывается main и не передается клиенту top .

Мы можем обратиться к https://unix.stackexchange.com/questions/102061/ctrl-c-handling-in-ssh-session, где обсуждается эта тема.

ssh remotehost запустит интерактивный сеанс на remotehost. На стороне клиента ssh попытается установить tty, используемый stdin, в режим "raw", а sshd на удаленном хосте выделит псевдо-tty и запустит вашу оболочку как оболочку входа (например, -bash).

Установка необработанного режима означает, что символы, которые обычно посылают сигналы (такие как Ctrl-C и Ctrl-), вместо этого просто вставляются во входной поток. ssh отправит такие символы как есть на удаленный хост, где они, вероятно, отправят SIGINT или SIGQUIT и, как правило, уничтожат любую команду и вернут вас в оболочку на удаленном хосте. Соединение ssh останется живым, пока удаленная оболочка жива.

...

ssh remotehost command args ... запустит неинтерактивный сеанс на удаленном хосте. На стороне клиента ssh не установит tty в сырой режим (ну, кроме как для чтения в пароле или парольной фразе). Если вы наберете Ctrl-C, ssh получит отправленный SIGINT и будет немедленно прерван, даже не выдав сообщения о закрытии соединения с удаленным хостом.

Поэтому я подозреваю, что ваш сеанс PuTTY настроен не так, как ваш сеанс MobaXterm, и что происходит кое-что, о чем вы (и, следовательно, мы) не знаем.

PuTTY не отправляет сигнал, он отправляет управляющий символ ASCII. Это легко доказать. Мы просто просим оболочку сделать так, чтобы управляющий символ ASCII 0x03 (ETX, Ctrl+C) не имел специальной обработки оболочкой, а затем посмотрим, что посылает PuTTY:

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

См. Http://tldp.org/LDP/abs/html/exitcodes.html 130 = 128+2 = сигнал 2. В этом случае я использовал ^ A для отправки 0x01 оболочке, которая отправила сигнал 2 top процессу. ^ C только что отправил 0x03, cat-V отображается как ^ C.

Поэтому я бы НЕ пытался выяснить, почему Putty "отправляет" SIGINTR, а mobaXterm - нет. Никто из них не делает этого. Они просто посылают управляющий символ ASCII.


Посмотрите, как вы вызываете PuTTY, щелкнув по значку на рабочем столе? Имеет ли этот значок свойства (Alt + Enter) с дополнительными параметрами в Target? и т. д.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .