Come posso riconnettermi a una sessione ssh dopo una pipe rotta?


28

Quindi stavo correndo apt-get upgradesu un server quando il router ha deciso che era passato troppo tempo dall'ultima volta che mi ha fatto arrabbiare: ha lasciato cadere tutta la connessione. La morale della storia è di usare screenmolto quando sei su un router barbone.

Ad ogni modo, ho effettuato nuovamente l'accesso e ho scoperto in htop che il processo era ancora sospeso lì, ancora in attesa che il mio Y / n si aggiornasse (per fortuna non l'aveva ancora raggiunto). Esiste un modo per ricollegarmi a una sessione interrotta? Ho finito per ucciderlo dal momento che non era nel mezzo della gestione dei pacchetti, ma sarebbe bello sapere come riferimento futuro.


1
Sono sorpreso che il apt-getprocesso fosse ancora in corso. Sarebbe dovuto morire insieme all'intera catena di processi fino a SSH. Ho notato che do-dist-upgradesi avvia automaticamente in una screen/ byobusessione: forse in alcune circostanze, apt-getfa lo stesso?
nfirvine,

Risposte:


16

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, la soluzione è utilizzare lo schermo quando possibile (a proposito, tmux è un'alternativa allo schermo).


1
Ma cosa succede se hai ssh senza password? Puoi farlo allora?
Sridhar Sarnobat,

1
byobuè un front-end piacevole, più facile da usare per screen(o tmux) - merita sicuramente una
visita

Sridhar-Samobol, l'autenticazione deve ancora aver luogo. Associarsi a una sessione in corso non ha modo di ripetere la stretta di mano iniziale, quindi i suoi invarianti verrebbero interrotti se introducessimo una nuova sessione in una esistente. Risposta: no.
Kevin il

9

Per l'esecuzione di processi di lunga durata, utilizzo screen o byobu se desideri un'interfaccia più intuitiva.

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 automaticamente chiusa. Se desideri mantenere la sessione dopo l'esecuzione del programma, esegui la schermata senza argomenti e all'interno della sessione verrà visualizzato un nuovo prompt. CTRL + A + D stacca il terminale dalla sessione corrente.

Per ricollegarsi a una sessione precedente:

screen -r

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

Byobu è un bel miglioramento. È basato sullo schermo , ma fornisce una barra in basso 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 assegna un nome descrittivo alla scheda della sessione corrente
  • F9 apre un menu di opzioni
  • CTRL + A + D stacca tutte le sessioni dal terminale.

PAROLA DI CONSIGLIO : evitare di lasciare una sessione aperta con l'utente root . Se qualcuno accede al tuo terminale (localmente o da remoto), può facilmente ricollegarsi a una sessione in corso e usare il tuo sistema come root. Se necessario, è meglio avviare una sessione usando un utente comune e sudo le righe di comando individuali secondo necessità.


1
Vorrei citare il PO: "La morale della storia è usare molto lo schermo ". Apparentemente questa non era la domanda qui.
Gennaio

Grazie per la recensione, ma gennaio è stato corretto.

Utilizzare sudo screen <command> per impostare una schermata come root, che necessita dell'accesso sudo per riconnettersi ad essa. Molto meglio che avviare normalmente uno schermo, per poi passare a root al suo interno.
djsmiley2k - CoW,

8

Sebbene non sia possibile ricollegarsi a una sessione SSH interrotta, è possibile ripartire il processo in esecuzione all'interno di SSH , funzionalmente equivalente a quello desiderato.

Istruzioni

Nel tuo caso, assumerai il controllo del apt-getprocesso da una nuova sessione SSH, screensessione o simili. Il mio preferito per questo è il reptyrcomando:

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

Quindi, con il pid che hai trovato per il tuo processo:

$ sudo reptyr -T 10626

O se non funziona, prova:

$ reptyr 10626

Dopo questa fase, tutti i tuoi input da tastiera vanno al programma che hai assunto. Sfortunatamente non vedrai l'output precedente della sessione SSH, come l' apt-getoutput che ti chiede conferma.

spiegazioni

Esistono diversi altri strumenti che funzionano sostanzialmente allo stesso modo reptyr(ovvero tramite l' ptraceallegato di debug). Vedi le seguenti domande e risposte in cui vengono discusse:

Nelle istruzioni sopra, reptyr 10626usa l' ptraceallegato di debug mentre il sudo reptyr -T 10626comando usa il furto TTY ed è preferibile ( dettagli ).

Infine, il motivo per cui non è possibile assumere una sessione SSH in questo modo è perché un sshdprocesso non è controllato da un terminale host, ma fornisce la parte slave di un terminale - un ptsdispositivo - mentre la parte master che lo controlla risiede sul macchina client, qui con una sessione SSH suddivisa in mezzo. Quando si forza a subentrare a tale sshdprocesso con reptyr -s <pid>, l'input da tastiera passa a quel processo, non al suo processo figlio attivo. Quindi un "Ctrl + Z" lo ucciderà semplicemente sshd.


1

Stavo facendo do-dist-upgradevia SSH da un laptop che è andato in sospensione, quindi Broken pipe. Tornando alla macchina, vedevo ancora in corso i processi relativi all'aggiornamento, tra cui un whiptailchiedermi input (quale display manager scegliere) e, in modo rilevante, di proprietà di root SCREEN. Sono stato in grado di fare sudo su -e screen -rcollegarmi alla sessione e, ecco, ho la finestra a coda di frusta davanti a me in grado di ricevere input. Sono stato in grado di riprendere l'aggiornamento senza problemi.

Nota: questo è stato un aggiornamento da Ubuntu 14.04 a 16.04.

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.