uther's answer diz para você alocar um terminal, mas não explica por quê. A razão não é específica do ssh, é uma questão de geração e propagação de sinais. Convido-vos a ler O que faz com que vários sinais sejam enviados ? para mais informações.
No host remoto, há dois processos relevantes:
- uma instância do daemon ssh (
sshd
), que está transmitindo a entrada e a saída do programa remoto para o terminal local; - um shell, que está executando esse
for
loop.
O shell pode morrer naturalmente quando atinge o final do loop ou passa por um erro fatal ou por um sinal. A questão é, por que o shell receberia um sinal?
Se o shell remoto estiver conectado a sshd
over pipes, que é o que acontece quando você especifica um comando na linha de comando ssh
, ele morrerá de um SIGPIPE se sshd
sair e o shell tentar gravar no pipe. Enquanto o shell não estiver gravando no pipe, ele não receberá um SIGPIPE. Aqui, o shell nunca está escrevendo nada para sua saída padrão, então ele pode viver para sempre.
Você pode passar a opção -t
para ssh, para dizer-lhe para emular um terminal no lado remoto e executar o comando especificado neste terminal. Então, se o cliente SSH desaparecer, sshd
fecha a conexão e sai, destruindo o terminal. Quando o dispositivo de terminal desaparece, qualquer processo em execução nele recebe um SIGHUP . Portanto, se você matar o cliente SSH (com kill
ou fechando o terminal em que o cliente está sendo executado), o shell remoto será SIGHUPped.
Se você passar a opção -t
, o SSH também transmitirá SIGINT . Se você pressionar Ctrl + C , o shell remoto receberá uma SIGINT.