PuTTy SSH сессия прервана сигналом 2

1450
Gefolge

Когда я подключаюсь к машине через 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). Я думаю, что если мы исправим этот путь, проблема будет решена.

0
Я думаю, что если вы нажмете «Q» или «q» в верхней части, вы выйдете из нее. Ты это пробовал ? C0deDaedalus 6 лет назад 2
Да. Сожалею. Я просто хочу привести пример. Не просто "top", я иногда использую Ctrl + C, чтобы убить какой-то процесс. Gefolge 6 лет назад 0

1 ответ на вопрос

1
RedGrittyBrick

Я не могу использовать комбинацию "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 с * nix компьютера mainна * nix компьютер client. Оставляя вас в приглашении оболочки * 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запустит интерактивный сеанс на удаленном хосте. На стороне клиента 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 = signal 2. В этом случае я использовал ^ A для отправки 0x01 в оболочку, которая отправила сигнал 2 topпроцессу. ^ C только что отправил 0x03, который cat-Vотображается как ^ C.

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


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

На самом деле проблема не в вершине. Это касается каждого прерывания, которое я использую. Если я ввожу неправильную команду, и когда я использую Ctrl + C, чтобы отказаться от этого, я теряю свое соединение ssh .. Я думаю, что при использовании MobaXterm Ctrl + C был отправлен на клиентский сервер, а при использовании PuTTy сигнал прерывания был отправлен Основной сервер (так что процесс подключения SSH). Я думаю, что если мы исправим этот путь, проблема будет решена. Gefolge 6 лет назад 0
@ Gefolge: сигнал всегда передается на главный. Вопрос в том, как процесс на главном обрабатывает этот сигнал. Это зависит от того, как именно этот процесс был вызван, это зависит от наличия (как на основном, так и на клиенте) псевдонимов и сценариев. Например, может быть, у main есть скрипт top, который по какой-то причине запускает `ssh client top`? RedGrittyBrick 6 лет назад 1

Похожие вопросы