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
forloop.
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.