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: é ...
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
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?
ssh remote command
em oposição assh 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, usessh remote
.Respostas:
ssh
pode ser invocado de algumas maneiras diferentes, cada uma delas resultando em tratamento ligeiramente diferente de sinais iniciados pelo terminal Ctrl-C.ssh remotehost
executará uma sessão interativa emremotehost
. No lado do cliente,ssh
tentará definir o tty usado pelo stdin para o modo "bruto", esshd
no 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.
ssh
enviará 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 interativaremotehost
, 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 remotosshd
fecha a conexão essh
relataConnection to remotehost closed.
ssh remotehost command args ...
executará uma sessão não interativa emremotehost
. No lado do cliente,ssh
irá não definir o tty no modo bruto (bem, exceto para ler em uma senha ou frase secreta). Se você digitar Ctrl-C,ssh
será enviado o SIGINT e será imediatamente encerrado, sem emitir umaConnection to remotehost closed
mensagem.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.fonte