Когда я запускаю сеанс SSH, который выполняет длительную команду, что происходит с обработкой Ctrl+ C(SIGINT)?
Я вижу, что сессия SSH закрыта, но я не уверен, кто первым получит SIGINT: это ...
удаленная долгосрочная команда? то есть (а) обработчик сигнала в удаленной команде вызывается и останавливает удаленную команду, (б) порожденная им оболочка обнаруживает, что команда остановлена, а также останавливается (в) удаленный sshd обнаруживает остановленную оболочку, поэтому он закрывает соединение
или
локальный ssh получает сигнал и закрывает соединение.
Я думаю, что (1) происходит, но хочу убедиться.
Я также не уверен в том, что происходит с обработкой оболочки SIGINT в этом случае. Например, если я ...
ssh remote 'while true ; do sleep 1 ; date ; done'
и Ctrl+ C, тогда удаленное соединение сбрасывается. Есть ли способ запустить удаленную команду из оболочки, которая останется в живых после Ctrl+ C? То есть в этом случае остановить цикл и разрешить мне продолжать работать с удаленной оболочкой?
ssh remote command
в отличие отssh remote
) будет уничтожен (на локальной стороне) SIGINT, сгенерированным путем ввода ctrl-C. Удаленная сторона, вероятно, (в зависимости от ОС) будет работать до тех пор, пока не попытается выполнить чтение или запись в закрытый сокет. Если вы хотите, чтобы все нажатия клавиш, включая ctrl-C, передавались на удаленный компьютер, используйтеssh remote
.Ответы:
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-Cssh
Connection to remotehost closed
Эти
your_shell -c "command args ..."
процессы будут , вероятно , продолжать работать на удаленном хосте . Либо они выйдут самостоятельно, либо один процесс попытается записать данные в закрытый теперь сокет ssh, что приведет к отправке (обычно) фатального сигнала SIGPIPE.источник