Fechando a conexão depois de executar a reinicialização usando o comando ssh

14

Estou usando o comando reboot -f remotamente para forçar a reinicialização de uma máquina Unix. O problema é que a conexão ssh permanece ativa por um longo tempo que eu não sei porque? Eu quero fechar a conexão ssh imediatamente após a reinicialização da máquina e retornar ao meu shell local. Como eu posso fazer isso? Observe que o comando de reinicialização sem -f flag não funciona.

    
por coffeMug 12.12.2012 / 10:27

10 respostas

19

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 é:

  1. O shell remoto inicia o comando reboot em segundo plano.
  2. 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.
  3. 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.

    
por 13.12.2012 / 02:56
3

Eu encontrei esta solução para fazer o melhor para mim.

Use -o "ServerAliveInterval 2" com seu comando ssh , da seguinte forma:

$ ssh -o "ServerAliveInterval 2" root@remotehost reboot

A opção mencionada faz com que o lado do cliente enfie o servidor por um canal seguro a cada 2 segundos. Eventualmente, quando a reinicialização continuar, ela irá parar para responder e o cliente irá desligar a conexão.

    
por 27.11.2015 / 13:01
2

Algumas respostas foram próximas, mas a resposta certa é:

ssh [email protected] "nohup sudo reboot &>/dev/null & exit"

explicação:

  • você deseja exit como o último comando para que o status do último comando seja 0 (sucesso). Você pode preceder um sono se desejar, mas não é necessário
  • você precisa executar a reinicialização em segundo plano, porque senão o servidor fechará a conexão e você receberá um erro. Ele ainda será reinicializado na maioria dos sistemas, mas se você estiver executando o script, o status de retorno será erro (não 0), mesmo com o comando sendo executado corretamente
  • a execução no plano de fundo não é suficiente, pois os stdin e stdout ainda estão conectados ao terminal virtual por meio do SSH, portanto, a conexão não será fechada. Você precisa fazer duas coisas extras para a sessão SSH terminar e deixar o comando em execução no plano de fundo.
    • 1) você precisa redirecionar stdout e stderr para /dev/null para que eles não sejam redirecionados pelo terminal virtual que mantém a sessão SSH. Esta é a parte &>/dev/null .
    • 2) você precisa redirecionar stdin para um arquivo ilegível da mesma forma. Isso é o que o shell embutido em nohup faz.

Com apenas um comando em execução no segundo plano desviado do terminal em todos os sentidos, exit fechará a sessão e, como não há stdin ou stdout restantes no terminal virtual, o SSH encerrará a conexão sem erros .

    
por 06.03.2017 / 19:12
1

Eu uso o seguinte comando:

ssh -t <hostname> 'sudo shutdown --reboot 0 && exit'

Veja o que isso está fazendo:

  • Instrui a máquina a ser reinicializada no momento seguinte, mas não durante este comando
  • sai limpo do SSH
  • Mantém o SSH TTY o tempo todo para que o sudo esteja feliz e possa executar corretamente.
por 09.01.2018 / 03:20
0

Já experimentou o seguinte

# shutdown -r now

Acho que em alguns sistemas em que trabalhei no passe, o comando reboot teve alguns problemas. Então, novamente, eu não consigo encontrar nada na manpage do desligamento que faria o mesmo que reiniciar com o sinalizador -f.

    
por 12.12.2012 / 13:03
0

Que tal sair da sessão ssh e reiniciar o sistema usando o próximo comando:

ssh login@host "reboot -f"

Depois disso, pressione Ctrl + C para encerrar ssh.

    
por 12.12.2012 / 14:04
0

Eu encontrei uma solução para isso que pode ser útil para os outros também. Eu usei o seguinte comando para fechar a conexão logo após iniciar o comando anexado ao ssh:

ssh host "command to run on the host machine > /dev/null &"

Eu não entendo exatamente o motivo pelo qual esse comando força a conexão a ser fechada, mas pelo menos foi útil para mim. Se alguém entender porque mata a conexão ssh; por favor explique.

    
por 12.12.2012 / 15:37
0

Isso requer um atraso de 1 minuto, mas funcionou de maneira confiável para mim e resolve o problema do travamento do cliente SSH:

    $ sudo shutdown +1; logout

Isso programa o desligamento do sistema por 1 minuto depois, o que permite que o logout e, portanto, a finalização do SSH sejam concluídos. Se você quiser esperar o mínimo de tempo possível, poderá substituir o +1 por HH:MM por uma hora do dia que se aproxima rapidamente, mas isso pode ser complicado para o tempo corretamente e pode ter um atraso de até 59 segundos. >     

por 14.01.2017 / 17:19
0

Uma maneira simples que encontrei é comandar o encerramento / reinicialização como uma tarefa em segundo plano (usando '&'), protegendo-a de ser fechada quando a sessão é fechada com 'nohup', junto com shell / session imediato sair:

nohup shutdown -r now & exit

Desta forma, o cliente SSH não trava, já que a sessão sai imediatamente, enquanto o sistema remoto prossegue com sua reinicialização de forma assíncrona.

    
por 08.11.2016 / 17:15
-2

Experimente este comando:

$ reboot -f && exit
    
por 12.12.2012 / 10:37

Tags