O comando reboot -f
nunca retorna (a menos que você não tenha permissão para causar uma reinicialização). No momento em que é emitido, o cliente SSH está aguardando algo para fazer, o que pode ser:
- o servidor SSH notificando o cliente que algo aconteceu que requer atenção, por exemplo, que há alguma saída a ser exibida ou que o comando remoto foi concluído;
- algum evento no lado do cliente, como um sinal para retransmitir;
- um timer sendo acionado para fazer com que o cliente envie uma mensagem de manutenção permanente (e feche a conexão se o servidor não responder).
Como o processo do servidor SSH está inoperante, o cliente SSH não morre até que o cronômetro seja acionado.
Se você executar ssh remotehost 'reboot -f >/dev/null &'
, o que acontece é:
- O shell remoto inicia o
reboot
comando em segundo plano.
- Como o comando shell do lado do servidor foi encerrado e não há processo mantendo o descritor de arquivo da saída padrão aberto, o servidor SSH fecha a conexão.
- O
reboot
comando faz com que a máquina seja reinicializada.
No entanto, isso não é confiável: dependendo do tempo, a etapa 3 pode ocorrer antes da etapa 2. A adição de um timer 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 reboot
, assegurando-se de que ele não seja realmente reiniciado antes de notificar o cliente de que está comprometido, você precisa de uma notificação adicional para passar do servidor para o cliente. Isso pode ser emitido através da conexão SSH, mas fica complicado.