O comando reboot -f
nunca retorna (a menos que você não tenha permissão para causar uma reinicialização). No ponto em que é emitido, o cliente SSH está aguardando algo para fazer, o que poderia ser:
- o servidor SSH notificando o cliente que algo aconteceu que requer sua atenção, por exemplo, que há alguma saída para exibir ou que o comando remoto foi concluído;
- algum evento no lado do cliente, como um sinal para retransmitir;
- um timer disparando para fazer com que o cliente envie uma mensagem de keepalive (e feche a conexão se o servidor não responder).
Como o processo do servidor SSH está inativo, o cliente SSH não morrerá até que o timer seja acionado.
Se você executar ssh remotehost 'reboot -f >/dev/null &'
, o que acontece é:
- O shell remoto inicia o comando
reboot
em segundo plano. - Como o comando shell do lado do servidor foi encerrado e não há nenhum processo mantendo o descritor de arquivo para saída padrão aberto, o servidor SSH fecha a conexão.
- O comando
reboot
faz com que a máquina seja reinicializada.
No entanto, isso não é confiável: dependendo do momento, a etapa 3 pode acontecer antes da etapa 2. Adicionar um cronômetro torna isso improvável:
ssh remotehost '{ sleep 1; reboot -f; } >/dev/null &'
Para ter certeza absoluta de que o lado do servidor está comprometido com a execução de reboot
, assegurando que ele não seja realmente reinicializado antes de notificar o cliente que está comprometido, é necessário uma notificação adicional para ir do servidor para o cliente. Isso pode ser feito através da conexão SSH, mas fica complicado.