Chiusura della connessione dopo l'esecuzione del riavvio mediante il comando ssh


18

Sto usando il reboot -fcomando da remoto per forzare il riavvio di una macchina Unix. Il problema è che la connessione ssh rimane attiva per molto tempo e non so perché? Voglio chiudere la connessione SSH subito dopo aver riavviato la macchina e tornare alla mia shell locale. Come posso fare ciò? Si noti che il comando di riavvio senza -fflag non funziona.


1
Perché non uscire semplicemente dalla connessione remota (Ctrl + D) e lasciare che il server si riavvii senza che tu debba guardare il prompt della shell?
gertvdijk,

Come posso farlo con lo stesso comando?
coffeMug

2
Ho trovato una soluzione per questo che potrebbe essere utile anche per gli altri. Ho usato il comando seguente per chiudere la connessione subito dopo aver avviato il comando associato a ssh: ssh host "comando da eseguire sul computer host> / dev / null &" Non capisco perfettamente il motivo per cui questo comando forza la connessione a vicino fatto ma almeno mi è stato utile. Se qualcuno capisce la direzione dell'output del comando su / dev / null e perché uccide la connessione ssh, sarebbe bello se lui / lei potesse spiegarlo. :-)
coffeMug

ssh host "comando da eseguire sul computer host> / dev / null &"
coffeMug

1
Non è una risposta a questa domanda, ma è utile sapere comunque: il client SSH ha una serie di caratteri di controllo che possono essere usati, tra le altre cose, per uccidere il client. I caratteri di controllo vengono riconosciuti solo immediatamente dopo una nuova riga, quindi iniziare premendo Enter. Quindi ad es. ~.Per terminare la sessione. Enter ~?per un elenco di altri.
Tom,

Risposte:


22

Il comando reboot -fnon restituisce mai (a meno che non si disponga dell'autorizzazione per causare un riavvio). Nel momento in cui viene emesso, il client SSH è in attesa di qualcosa da fare, che potrebbe essere:

  • il server SSH notifica al client che è successo qualcosa che richiede la sua attenzione, ad esempio che è presente un output da visualizzare o che il comando remoto è terminato;
  • qualche evento sul lato client, come un segnale da inoltrare;
  • un timer che si avvia per indurre il client a inviare un messaggio keepalive (e chiudere la connessione se il server non risponde).

Poiché il processo del server SSH è morto, il client SSH non morirà finché non scatta il timer.

Se corri ssh remotehost 'reboot -f >/dev/null &', allora succede:

  1. La shell remota avvia il rebootcomando in background.
  2. Poiché il comando della shell sul lato server è stato chiuso e non esiste alcun processo con il descrittore di file per l'output standard aperto, il server SSH chiude la connessione.
  3. Il rebootcomando fa riavviare la macchina.

Tuttavia, ciò non è affidabile: a seconda dei tempi, il passaggio 3 potrebbe verificarsi prima del passaggio 2. L'aggiunta di un timer rende improbabile questo:

ssh remotehost '{ sleep 1; reboot -f; } >/dev/null &'

Per essere assolutamente sicuri che il lato server sia impegnato nell'esecuzione reboot, assicurandosi che non si riavvii effettivamente prima di notificare al client che è stato impegnato, è necessaria una notifica aggiuntiva per passare dal server al client. Questo può essere emesso attraverso la connessione SSH, ma diventa complicato.


2
Nel caso qualcuno è alla ricerca di un modo per farlo dal di dentro l'host remoto (soluzione simile): (sleep 1 && sudo reboot &) && exit. Le parentesi generano un sottoprocesso, che attende un secondo e quindi avvia il riavvio. Il processo host tuttavia termina immediatamente la sessione ssh. Non sono un guru delle conchiglie, ma finora ha funzionato per me.
Griddo,

@Griddo Ha funzionato alla grande ed è un piccolo trucco. Lo adoro. Grazie per la condivisione!
Joshua Pinter,

5

Ho trovato questa soluzione per ottenere il meglio per me.

Utilizzare -o "ServerAliveInterval 2"con il sshcomando, in questo modo:

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

La suddetta opzione fa sì che il lato client invii il server su un canale sicuro ogni 2 secondi. Alla fine mentre procede il riavvio, smetterà di rispondere e il client interromperà la connessione.


Grazie romano, funziona come per magia! :)
stdcerr,

3

Alcune risposte erano vicine, ma la risposta giusta è:

ssh user@192.168.0.130 "nohup sudo reboot &>/dev/null & exit"

spiegazione:

  • si vuole exitcome l'ultimo comando in modo lo stato dell'ultimo comando è 0 (esito positivo). Se lo desideri, puoi anteporre un sonno, ma non è necessario
  • è necessario eseguire il riavvio in background, altrimenti il ​​server chiuderà la connessione e si verificherà un errore. Si riavvierà ancora sulla maggior parte dei sistemi ma se si esegue lo scripting lo stato di ritorno sarà errore (non 0) anche con il comando eseguito correttamente
  • l'esecuzione in background non è sufficiente, poiché stdine stdoutsono ancora collegati al terminale virtuale tramite SSH, quindi la connessione non verrà chiusa. Devi fare due cose extra per terminare la sessione SSH e lasciare il comando in esecuzione in background.
    • 1) è necessario reindirizzare stdoute stderrper /dev/nullmodo che non vengono reindirizzate dal terminale virtuale che contiene la sessione SSH. Questa è la &>/dev/nullparte
    • 2) è necessario reindirizzare stdina un file illeggibile nello stesso modo. Questo è ciò che fa la shell incorporata nohup.

Con solo un comando in esecuzione sullo sfondo dettato dal terminale in ogni modo, exitchiuderà la sessione e poiché non ci sono stdino stdoutlasciato sul terminale virtuale SSH terminerà la connessione senza errori.


1

Uso il seguente comando:

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

Ecco cosa sta facendo:

  • Indica alla macchina di riavviarsi nel momento successivo, ma non durante questo comando
  • Esce in modo pulito da SSH
  • Mantiene SSH TTY per tutto il tempo, quindi sudo è felice e può eseguire correttamente.

0

Hai provato quanto segue

# shutdown -r now

Trovo che su alcuni sistemi su cui ho lavorato nel pass, il comando reboot avesse dei problemi. Quindi di nuovo non riesco a trovare nulla nella manpage di shutdown che farebbe lo stesso del riavvio con il flag -f.


1
Sì, l'arresto non funziona nella macchina a cui sto cercando di connettermi per alcuni strani motivi. Ecco perché uso reboot -f per forzare l'arresto e il riavvio.
coffeMug

0

Che ne dici di uscire dalla sessione ssh e riavviare il sistema usando il comando successivo:

ssh login@host "reboot -f"

Dopo questo basta premere Ctrl + C per terminare ssh.


0

Ho trovato una soluzione per questo che potrebbe essere utile anche per gli altri. Ho usato il seguente comando per chiudere la connessione subito dopo aver avviato il comando associato a ssh:

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

Non capisco esattamente il motivo per cui questo comando forza la chiusura della connessione, ma almeno mi è stato utile. Se qualcuno capisce perché uccide la connessione ssh; Spiega per favore.


0

Ciò richiede un ritardo di 1 minuto, ma ha funzionato in modo affidabile per me e risolve il problema del blocco del client SSH:

    $ sudo shutdown +1; logout

Ciò pianifica l'arresto del sistema per 1 minuto più tardi, il che consente il completamento del logout, quindi la chiusura di SSH. Se si vuole attendere il minor tempo possibile, si potrebbe sostituire il +1con HH:MMper un tempo rapido avvicinarsi del giorno, ma che potrebbe essere difficile correttamente tempo e può avere fino a un secondo di ritardo 59.


0

Un modo semplice che ho trovato è quello di comandare l'arresto / riavvio come attività in background (usando '&'), proteggendolo dalla chiusura quando la sessione si chiude con 'nohup', insieme all'uscita immediata della shell / sessione:

nohup shutdown -r now & exit

In questo modo, il client SSH non si blocca, poiché la sessione termina immediatamente, mentre il sistema remoto procede al suo riavvio in modo asincrono.


O sostituisci l'equivalente del tuo sistema a "shutdown -r now" per un riavvio ....
MikeW

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.