Come posso riconnettermi a una sessione ssh dopo un pipe rotto?

21

Quindi stavo correndo apt-get upgrade su un server quando il router ha deciso che era passato troppo tempo dall'ultima volta che mi ha fatto arrabbiare: ha fatto cadere tutta la connessione. Morale della trama è usare screen molto quando sei su un router di bum.

Ad ogni modo, ho fatto il login e ho trovato in htop che il processo era ancora sospeso, ancora in attesa che il mio Y / n effettuasse l'aggiornamento (non l'avevo ancora colpito, per fortuna). C'è un modo per riattaccare a una sessione che è stata interrotta? Ho finito per ucciderlo perché non era nel mezzo della gestione dei pacchetti, ma sarebbe bello sapere per riferimento futuro.

    
posta hexafraction 22.09.2012 - 05:49

3 risposte

14

La risposta alla tua domanda corretta è: non puoi . Penso che il problema principale sia che le procedure di autenticazione non saranno sincronizzate. Semplicemente non funziona così.

Come hai notato tu, la soluzione è usare la schermata quando possibile (a proposito, tmux è un'alternativa allo schermo) .

    
risposta data January 28.09.2012 - 12:11
8

Per eseguire processi di lunga durata, utilizzo screen o byobu se vuoi un'interfaccia più amichevole.

Per lo schermo, puoi usare:

screen [program] [args]

Questo eseguirà [programma] e i suoi [argomenti] all'interno di una sessione dello schermo . Al termine del programma, la sessione viene chiusa automaticamente. Se desideri mantenere la sessione dopo l'esecuzione del programma, esegui schermo senza argomenti e verrà visualizzato un nuovo prompt all'interno della sessione. CTRL + A + D scollega il terminale dalla sessione corrente.

Per riattaccare a una sessione precedente:

screen -r

Se è aperta una sola sessione, si ricollegherà immediatamente. Se sono in corso più sessioni, ti chiederà a quale vuoi collegarti. Se conosci il nome della sessione, puoi aggiungerlo come argomento a questa riga di comando.

Byobu è un bel miglioramento. Si basa sulla schermata , ma fornisce una barra nella parte inferiore che mostra tutte le sessioni correnti come schede e offre scorciatoie più semplici per spostarle. Puoi:

  • F2 avvia una nuova sessione
  • F3 passa alla scheda della sessione successiva a sinistra
  • F4 passa alla scheda della sessione successiva a destra
  • F8 danno un nome descrittivo alla scheda della sessione corrente
  • F9 apre un menu opzioni
  • CTRL + A + D stacca tutte le sessioni dal terminale.

PAROLA DI CONSIGLI : evita di lasciare una sessione aperta con l'utente root . Se qualcuno accede al tuo terminale (localmente o remotamente), può facilmente riattaccare a una sessione in corso e utilizzare il tuo sistema come root. Se necessario, è meglio iniziare una sessione usando un utente comune e sudo le linee di comando indivuduali, se necessario.

    
risposta data JulioHM 27.09.2012 - 23:44
5

Sebbene non sia possibile ricollegare a una sessione SSH rotta, è possibile eseguire una riparazione all'interno del processo, equivalente a ciò che si desidera.

Nel tuo caso, prenderesti il ​​controllo del processo apt-get per essere controllato da una sessione SSH nuova , sessione screen o simile. Il mio preferito è il comando reptyr :

$ sudo apt-get install reptyr
$ ps ax | grep apt-get
10626 pts/8   R+     0:32 apt-get upgrade

Quindi, con il pid trovato per il tuo processo:

$ reptyr 10626

Dopo questa fase, tutto il tuo input da tastiera va al programma che hai preso in consegna. Sfortunatamente non vedrai il vecchio output della sessione SSH, come l'output apt-get che ti chiede conferma.

Esistono molti altri strumenti che funzionano fondamentalmente come reptyr (cioè tramite ptrace allegato di debug). Vedi le seguenti domande e risposte dove sono discusse:

(Dettagli: il motivo per cui non è possibile eseguire una sessione SSH in questo modo è perché un processo sshd non è controllato da un terminale host, ma fornisce la parte slave di un terminale - un dispositivo pts - mentre la parte master che lo controlla risiede sul computer client, qui con una sessione SSH suddivisa in mezzo. Quando imposti il ​​rilevamento di un processo sshd con reptyr -s <pid> , l'input della tastiera va a quel processo, non al suo processo figlio attivo, quindi un "Ctrl + Z" eliminerà semplicemente quel sshd .)

    
risposta data tanius 16.02.2017 - 15:12

Leggi altre domande sui tag