Обработка Ctrl-C в сеансе SSH

20

Когда я запускаю сеанс SSH, который выполняет длительную команду, что происходит с обработкой Ctrl+ C(SIGINT)?

Я вижу, что сессия SSH закрыта, но я не уверен, кто первым получит SIGINT: это ...

  1. удаленная долгосрочная команда? то есть (а) обработчик сигнала в удаленной команде вызывается и останавливает удаленную команду, (б) порожденная им оболочка обнаруживает, что команда остановлена, а также останавливается (в) удаленный sshd обнаруживает остановленную оболочку, поэтому он закрывает соединение

    или

  2. локальный ssh ​​получает сигнал и закрывает соединение.

Я думаю, что (1) происходит, но хочу убедиться.

Я также не уверен в том, что происходит с обработкой оболочки SIGINT в этом случае. Например, если я ...

ssh remote 'while true ; do sleep 1 ; date ; done'

и Ctrl+ C, тогда удаленное соединение сбрасывается. Есть ли способ запустить удаленную команду из оболочки, которая останется в живых после Ctrl+ C? То есть в этом случае остановить цикл и разрешить мне продолжать работать с удаленной оболочкой?

ttsiodras
источник
3
Неинтерактивный ssh ​​( ssh remote commandв отличие от ssh remote) будет уничтожен (на локальной стороне) SIGINT, сгенерированным путем ввода ctrl-C. Удаленная сторона, вероятно, (в зависимости от ОС) будет работать до тех пор, пока не попытается выполнить чтение или запись в закрытый сокет. Если вы хотите, чтобы все нажатия клавиш, включая ctrl-C, передавались на удаленный компьютер, используйте ssh remote.
Марк Плотник
@MarkPlotnick: ОК. Отметьте - если вы добавите свой ответ ниже в качестве ответа, я приму его ... В своих собственных тестах я убедился, что пульт дистанционного управления не получает никакого сигнала.
Циодрас
связанные с : unix.stackexchange.com/questions/40023/...
Бернарда Паулюс

Ответы:

23

sshмогут быть вызваны несколькими различными способами, каждый из которых приводит к несколько разному трактованию сигналов, инициируемых терминалом, таких как Ctrl-C.

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

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

  • ssh -t remotehost command args ...будет запущен интерактивный сеанс remotehost, как описано выше, за исключением удаленной стороны your_shell -c "command args ...". Как указано выше, если вы введете текст Ctrl-C, он будет отправлен на удаленный хост, где команда, скорее всего, получит SIGINT и немедленно выйдет, а затем удаленная оболочка завершится. Затем пульт sshdзакрывает соединение и sshсообщаетConnection to remotehost closed.

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

    Эти your_shell -c "command args ..."процессы будут , вероятно , продолжать работать на удаленном хосте . Либо они выйдут самостоятельно, либо один процесс попытается записать данные в закрытый теперь сокет ssh, что приведет к отправке (обычно) фатального сигнала SIGPIPE.

Марк Плотник
источник
1
Технически, удаленная команда не записывает напрямую в сокет. Его стандартный выход - это труба. А sshd на другом конце читает данные, шифрует их и отправляет через сокет. Конечный результат все тот же. Команда получит sigpipe, потому что этот канал пропал, когда клиент отключается.
Стефан Шазелас
@ StéphaneChazelas Спасибо, я отредактирую ответ, чтобы исправить его.
Марк Плотник