Manipulação Ctrl-C na sessão SSH

16

Quando inicio uma sessão SSH que executa um comando de longa duração, o que acontece com a manipulação Ctrl + C (SIGINT)?

Eu posso ver que a sessão SSH está fechada, mas não tenho certeza de quem receberá o SIGINT primeiro: será ...

  1. o comando remoto de longa duração? isto é, (a) o manipulador de sinal no comando remoto é chamado e interrompe o comando remoto, (b) o shell que o gerou detecta que o comando parou e pára também (c) o sshd remoto detecta o shell parado, então fecha a conexão

    ou

  2. o ssh local recebe o sinal e fecha a conexão.

Eu acho que (1) está acontecendo, mas quero ter certeza.

Eu também não tenho certeza sobre o que acontece com o tratamento de shell de SIGINTs neste caso. Por exemplo, se eu ...

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

e Ctrl + C , a conexão remota é descartada. Existe uma maneira de executar o comando remoto sob um shell que permanecerá ativo após Ctrl + C ? Ou seja, nesse caso, pare o loop e permita que eu continue trabalhando no shell remoto?

    
por ttsiodras 21.11.2013 / 11:35

1 resposta

16

ssh pode ser chamado de algumas maneiras diferentes, cada um resultando em tratamento ligeiramente diferente de sinais iniciados pelo terminal como Ctrl-C .

  • ssh remotehost executará uma sessão interativa em remotehost . No lado do cliente, ssh tentará definir o tty usado pelo stdin para o modo "bruto", e sshd no host remoto alocará uma pseudo-tty e executará seu shell como um shell de login (por exemplo, -bash ).

    A definição do modo raw significa que os caracteres que normalmente enviam sinais (como Ctrl-C e Ctrl - \ ) são inseridos no fluxo de entrada. ssh enviará tais caracteres como estão para o host remoto, onde eles provavelmente enviarão SIGINT ou SIGQUIT e, normalmente, matarão qualquer comando e o retornarão a um shell no host remoto. A conexão ssh permanecerá ativa, contanto que o shell remoto esteja ativo.

  • ssh -t remotehost command args ... executará uma sessão interativa em remotehost , assim como o acima, exceto no lado remoto, your_shell -c "command args ..." será executado. Como acima, se você digitar Ctrl-C , ele será enviado ao host remoto, onde o comando provavelmente receberá SIGINT e imediatamente sairá, e então o shell remoto sairá. O controle remoto sshd fecha a conexão e ssh relatórios Connection to remotehost closed.

  • ssh remotehost command args ... executará uma sessão não interativa em remotehost . No lado do cliente, ssh não definirá o tty para o modo raw (bem, exceto para ler uma senha ou passphrase). Se você digitar Ctrl-C , ssh será enviado SIGINT e será imediatamente terminado, sem mesmo emitir uma mensagem Connection to remotehost closed .

    Os your_shell -c "command args ..." processos provavelmente permanecerão em execução no host remoto . Ou eles sairão sozinhos, ou um processo tentará gravar dados no soquete ssh agora fechado, o que fará com que um sinal SIGPIPE (normalmente) fatal seja enviado para ele.

por 13.10.2014 / 20:17

Tags