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

20

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

Percebo que a sessão SSH está encerrada, mas não tenho certeza de quem recebe o SIGINT primeiro: é ...

  1. o comando remoto de longa duração? isto é, (a) o manipulador de sinal no comando remoto é chamado e para o comando remoto, (b) o shell que gerou ele detecta que o comando parou e também para (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.

Também estou incerto sobre o que acontece com o manuseio de shell dos SIGINTs neste caso. Por exemplo, se eu ...

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

e Ctrl+ C, a conexão remota é interrompida. Existe uma maneira de executar o comando remoto em um shell que permanecerá ativo após o Ctrl+ C? Ou seja, nesse caso, interrompa o loop e permita-me continuar trabalhando no shell remoto?

ttsiodras
fonte
3
Um ssh não interativo ( ssh remote commandem oposição a ssh remote) será eliminado (no lado local) pelo SIGINT gerado, digitando ctrl-C. O lado remoto provavelmente (depende do sistema operacional) permanecerá em execução até tentar ler ou gravar no soquete fechado. Se você deseja que todas as teclas digitadas, incluindo ctrl-C, sejam passadas para o controle remoto, use ssh remote.
Mark Plotnick
@ MarkPlotnick: OK Mark - se você adicionar sua resposta abaixo como resposta, eu a aceitarei ... Nos meus próprios testes, verifiquei que o controle remoto não recebe nenhum sinal.
Ttsiodras
relacionados: unix.stackexchange.com/questions/40023/...
bernard Paulus

Respostas:

23

sshpode ser invocado de algumas maneiras diferentes, cada uma delas resultando em tratamento ligeiramente diferente de sinais iniciados pelo terminal Ctrl-C.

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

    Definir o modo bruto significa que os caracteres que normalmente enviariam sinais (como Ctrl-Ce Ctrl-\) são apenas inseridos no fluxo de entrada. sshenviará esses caracteres como estão para o host remoto, onde provavelmente enviarão SIGINT ou SIGQUIT e, normalmente, matarão qualquer comando e o levarão a um shell no host remoto. A conexão ssh permanecerá ativa, enquanto o shell remoto estiver ativo.

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

  • ssh remotehost command args ...executará uma sessão não interativa em remotehost. No lado do cliente, sshirá não definir o tty no modo bruto (bem, exceto para ler em uma senha ou frase secreta). Se você digitar Ctrl-C, sshserá enviado o SIGINT e será imediatamente encerrado, sem emitir uma Connection to remotehost closedmensagem.

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

Mark Plotnick
fonte
11
Tecnicamente, o comando remoto não grava diretamente no soquete. Seu padrão é um tubo. E o sshd na outra extremidade lê os dados, criptografa e envia pelo soquete. O resultado final é o mesmo. O comando receberá um sigpipe porque esse canal se foi quando o cliente se desconecta.
Stéphane Chazelas
@ StéphaneChazelas Obrigado, vou editar a resposta para corrigi-la.
Mark Plotnick