Come riconnettersi a una sessione ssh disconnessa


157

C'è un modo per connettersi a una sessione ssh che è stata disconnessa? Stiamo riscontrando problemi con la nostra connessione di rete a un sito remoto su cui stiamo lavorando separatamente; tuttavia, nel frattempo riscontriamo un gran numero di disconnessioni a causa di pacchetti persi mentre siamo connessi ai server nella posizione remota. Molte volte la sessione rimane attiva per un po ', a volte capita di trovarmi nel mezzo di alcune azioni (modifica dei file, esecuzione di alcuni processi, ecc ...) che devo ripristinare, piuttosto che riavviare, se possibile.


10
Non posso credere che nessuno abbia menzionato mosh.mit.edu
jwbensley il

@javano: non ne ho mai sentito parlare. Aggiungilo come risposta!
kbyrd,

@kbyrd Have done;)
jwbensley

una domanda simile è stata posta in unix.stackexchange.com/questions/105001/… con alcuni suggerimenti su come aggirare le disconnessioni in primo luogo ...
anarcat

Risposte:


136

AGGIORNAMENTO: per una risposta effettiva, vedere la risposta di zero_r di seguito

Questa non è una risposta, ma una soluzione alternativa. Usa lo schermo .

Al primo accesso, esegui schermo. Ottieni un'altra shell, esegui i comandi in quello. Se sei disconnesso, il processo dello schermo mantiene attivo il terminale in modo che la shell e i processi in esecuzione non cadano. Quando ti riconnetti, esegui 'screen -r' per riprendere.

C'è molto di più nella configurazione e nell'uso dello schermo, ma quanto sopra dovrebbe risolvere il problema.


18
O usa tmux - uno schermo "più fresco", ho usato entrambi e preferisco di gran lunga tmux perché puoi dividere il termine in modo gradevole.
John Hunt,

3
Sono stato felice di scoprire che screenera già installato sul mio Ubuntu 12.x quindi, se non si è sicuri di provare questo comando, si è ricollegato e ha ripreso il processo do-release-upgrade : sudo screen -D -r
bjm88

1
@ bjm88, sudodovrebbe essere usato solo se la sessione schermo originale è stata avviata con sudo. Altrimenti tornerà come se non esistesse alcuna sessione su schermo:There is no screen to be detached
Noam Manos,

+1 Mi rendo conto che questa non è la risposta effettiva; tuttavia, screen -rera esattamente quello che stavo cercando.
Eric Nelson,

130

Prova a impostare ClientAliveInterval (ad es. 60) e TCPKeepAlive (sì o no) su valori appropriati sul server sshd.conf.

Questo dovrebbe mantenere viva la sessione anche se la connessione si perde per minuti.


24
Finora, sembra che tu sia l'unico a rispondere alla domanda invece di suggerire lo schermo come soluzione alternativa.
kbyrd,

2
Buona chiamata. Abbiamo trovato questo metodo particolarmente utile quando si attraversano i firewall Cisco ASA / PIX, che per impostazione predefinita adorano il timeout delle connessioni TCPC.
Mike Pountney,

5
Forse questo non è il posto giusto per chiedere, ma è possibile che il poster cambi le risposte? Dovremmo rispondere allo "schermo" (il mio non è il migliore, mi piace Mike Pountney, ma ho il rappresentante) con queste informazioni.
kbyrd,

1
Funzionerà quando viene connesso tramite una connessione VPN Cisco e la connessione VPN viene persa e ristabilita?
Brent,

per me lo schermo funziona perfettamente, posso riconnettermi al compito schermato e countiune per funzionare
integratorIT

65

Come accennato in precedenza, GNU Screen è la strada da percorrere. Ti consentirà di avere una "sessione schermo" sulla casella remota in cui puoi eseguire più comandi, tramite più "finestre schermo". Questo si staccherà semplicemente se la tua connessione SSH genitore si interrompe, mantenendo tutti i sottoprocessi in esecuzione all'interno di essa vivi e bene.

' man screen' è tuo amico come al solito, e il pacchetto del sistema operativo dovrebbe essere chiamato ' screen' se non è installato di default.

Le basi sono:

  • Avvia una sessione schermo (sul tuo host remoto):

    $ screen
    
  • Disconnettersi dalla sessione di schermo: CTRL-A,d

  • Riconnettersi alla sessione dello schermo dopo aver effettuato nuovamente l'accesso:

    $ screen -d -r
    
  • Aprire un'altra 'finestra' schermo: CTRL-A,c

  • Passa attraverso voi schermo le finestre aperte: CTRL-A,space

Ci sono molte cose interessanti che puoi fare con Screen. Lo uso da oltre 10 anni e sto ancora scoprendo nuove funzionalità. È la mia utility Unix preferita.


1
Sì, questa è una risposta molto migliore della mia.
kbyrd,

Posso ancora connettermi alla sessione ssh disconnessa, se riavvio il mio PC su cui è in esecuzione lo schermo?
BarathVutukuri,

tmux è più potente
Pegasus il

46

Non posso credere che nessuno abbia menzionato MOSH ;

Mosh è un protocollo separato che può essere collegato al processo di accesso SSH, mantiene viva la sessione dopo giorni di disconnessione, modifica dell'IP, alta latenza e così via. È spiegato sulla home page meglio di quanto io possa spiegarlo, quindi ho copiato la descrizione qui sotto. Le mie esperienze e consigli sono che lo uso sul mio cellulare Android, è un salvavita quando viaggio e SSH. Lo stesso vale per il mio laptop, ad esempio quando è legato al cellulare sul treno. Consiglio di compilare dal sorgente per ottenere l'ultima versione, la versione repository per me all'interno di Ubuntu ha alcuni fastidi che sono stati risolti nella versione più recente (al momento della scrittura).

Mosh (shell mobile)

Applicazione terminale remota che consente il roaming, supporta la connettività intermittente e fornisce l'eco locale intelligente e la modifica della linea delle sequenze di tasti dell'utente.

Mosh è un sostituto di SSH. È più robusto e reattivo, soprattutto tramite collegamenti Wi-Fi, cellulari e interurbani.

Mosh è un software gratuito, disponibile per GNU / Linux, FreeBSD, Solaris, Mac OS X e Android.

Funzionalità dal sito Web:

  • Cambia IP. Resta connesso : Mosh si sposta automaticamente mentre ti sposti tra le connessioni Internet. Usa il Wi-Fi sul treno, Ethernet in un hotel e LTE su una spiaggia: rimarrai connesso. La maggior parte dei programmi di rete perde le connessioni dopo il roaming, comprese le app SSH e Web come Gmail. Mosh è diverso.

  • Realizza sogni d' oro: con Mosh, puoi mettere il tuo laptop a dormire e svegliarlo in seguito, mantenendo intatta la tua connessione. Se la connessione a Internet si interrompe, Mosh ti avviserà, ma la connessione riprenderà quando il servizio di rete tornerà.

  • Sbarazzati del ritardo di rete : SSH attende la risposta del server prima di mostrarti la tua digitazione. Questo può rendere un'interfaccia utente scadente. Mosh è diverso: fornisce una risposta istantanea alla digitazione, all'eliminazione e alla modifica delle linee. Lo fa in modo adattivo e funziona anche con programmi a schermo intero come emacs e vim. Su una cattiva connessione, vengono sottolineate le previsioni in sospeso in modo da non essere fuorviati.

  • Nessun codice privilegiato. Nessun demone : non è necessario essere il superutente per installare o eseguire Mosh. Il client e il server sono eseguibili gestiti da un utente normale e durano solo per la durata della connessione.

  • Stesso metodo di accesso : Mosh non ascolta sulle porte di rete né autentica gli utenti. Il client mosh accede al server tramite SSH e gli utenti presentano le stesse credenziali (ad es. Password, chiave pubblica) di prima. Quindi Mosh esegue il server mosh in remoto e si connette ad esso tramite UDP.

  • Funziona all'interno del tuo terminale, ma meglio : Mosh è un programma da riga di comando, come ssh. Puoi usarlo all'interno di xterm, gnome-terminal, urxvt, Terminal.app, iTerm, emacs, screen o tmux. Ma mosh è stato progettato da zero e supporta solo un set di caratteri: UTF-8. Corregge i bug Unicode in altri terminali e in SSH.

  • Control-C funziona alla grande : a differenza di SSH, il protocollo basato su UDP di mosh gestisce la perdita di pacchetti con grazia e imposta la frequenza dei fotogrammi in base alle condizioni della rete. Mosh non riempie i buffer di rete, quindi Control-C
    lavora sempre per fermare un processo in fuga.


8
Mosh non è un wrapper ssh: è un protocollo diverso, quasi del tutto estraneo a ssh (usa solo ssh per il login).
jch

+1 Molto vero, errore mio.
Jwbensley,

2
Che dire della sicurezza, amico in mezzo? crittografia? scambio di chiavi?
Nasir Iqbal,

Mosh sembra fantastico, anche se purtroppo non supporta ancora il port forwarding .
Boann,

20

autossh controlla la tua connessione e se si interrompe, si riconnette. È più affidabile di keepalives. Se ti connetti a una sessione dello schermo, proseguirai direttamente da dove ti sei disconnesso (vedi rscreenche viene fornito con autossh)


1
al di fuori di un keep-alive configurabile, non consente intrinsecamente di riconnettersi a una sessione (ciò che l'OP stava cercando). ma l'autossh può essere davvero utile per le app che richiedono tunnel ssh, mappatura delle porte, ecc.
ives

sì autossh + schermo sarebbe il punto debole. autossh ha rscreenper questo.
hayalci,

Autossh è meglio di mosh. Ho usato entrambi.
Sridhar Sarnobat,

Ecco un post sul blog di Jesse Keating, sull'uso dell'autossh con lo schermo .
sampablokuper,

12

tmux

Questo è un classico. Usalo ogni volta che corri il rischio di perdere la connessione a un terminale.

$ tmux
$ sh do_something_that_takes_forever

!! Connection fails so you reconnect once you notice

$ tmux ls
0: 1 windows (created Tue Aug 23 12:39:52 2011) [103x30]

$ tmux attach -t 0

Proprio così, sei tornato in azione.


Grazie mille! Stavo cercando come farlo con tmux, dal momento che sembra essere quello che la maggior parte delle persone considera l'opzione migliore.
CoolOppo,

10

Installerei e avvierei lo schermo per risolvere il tuo problema. Lo schermo ti consentirà di riconnetterti a una precedente sessione dello schermo.

A parte questo, lo schermo ti consente anche di fare cose interessanti come dividere lo schermo, visualizzare la console, ecc. Puoi trovare maggiori informazioni qui e qui .

Per cominciare, se vieni disconnesso, puoi usare

screen -ls

per visualizzare le sessioni e

screen -r ${session} 

per riconnettersi a uno disconnesso.


4

Come altri hanno sottolineato, lo schermo è generalmente la soluzione migliore per questo e aggiunge anche una serie di altre utili funzionalità.

Puoi configurare il tuo profilo sul computer remoto in modo che si avvii e / o riconnetta automaticamente allo schermo all'accesso, il che ti salva dimenticandoti di avviare lo schermo una volta che ne hai bisogno perché subisci una caduta della connessione.

Vedi http://tlug.dnho.net/?q=node/239 (o cerca in Google molti altri esempi che donano modi leggermente diversi).


3

un'alternativa più moderna allo schermo, purtroppo non disponibile per alcuni tipi di "virtualizzazione" (ad esempio in Cygwin puoi avere "schermo", ma non "tmux" a causa del modo in cui è progettato), ma ovunque tu abbia la possibilità di installare tmux , Consiglio vivamente di provare quell'istante di schermo.


3

Ecco un'altra soluzione non schermo.

Il vassoio Putty ti consente di fare proprio questo, ha un'opzione di riconnessione su disconnect che non è in normale o putty-ng

https://puttytray.goeswhere.com/

è un fork di stucco (completamente open source) con altre opzioni, vai alle impostazioni di connessione e ci sono 2 opzioni, una per "tentare di riconnettersi in caso di errore di connessione" e "tentare di riconnettersi all'avvio".


1
Ehh. Viene fornito con un keylogger e un'utilità di esfiltrazione ppk automatica, per caso?
Deer Hunter

1
Suppongo che tu ti stia chiedendo se in qualche modo, ruba i tuoi dettagli, è completamente open source, il codice sorgente è disponibile su github se vuoi guardare il suo github.com/FauxFaux/PuTTYTray ci sono parecchi contributori: )
Munkiepus,

grandi saluti :)
munkiepus,

2

Mentre lo schermo manterrà la sessione shell aperta sul server remoto se la sessione ssh cade, non farà nulla per il problema delle connessioni ssh interrotte. Come suggerisce zero_r, prova a sintonizzare la tua connessione ssh con keep alive e lunghi timeout.

Ti suggerisco di rintracciare la causa dei pacchetti persi che causano i problemi e risolverli invece di aggirarli.


Grazie per il suggerimento Stiamo lavorando per rintracciare il problema alla radice della perdita di pacchetti, ci vuole semplicemente un po 'di tempo per capirlo (molto complicato, questo!). Questa è davvero una soluzione per questo periodo di difficoltà. Non si sa mai quando qualcosa causerà una caduta della connessione.
cavallo pallido

1
Genererà molto rumore, ma puoi provare a eseguire ssh tramite strace e vedere cosa sta facendo / segnala quando la connessione ssh si interrompe. Potrebbe riferire solo quello che già sai, ma chi lo sa ...
David,

1

A volte mi sono dimenticato di eseguire anche lo schermo e di perdere il mio lavoro incompiuto. In questo caso, anche se non possiamo ricollegare a una sessione SSH interrotta, è possibile ripartire un programma in esecuzione su un nuovo terminale e riprendere ciò che stavi facendo grazie a reptyr.

Dopo una disconnessione accidentale da una sessione SSH, la prima cosa da fare è eseguire per screennon interrompere nuovamente la connessione. Quindi, nella nuova sessione, eseguire ps aux | grep {The process to be resumed}per ottenere il PID. Con il PID, puoi provare reptyr {PID}o reptyr -T {PID}(se ci sono sottoprocessi) per continuare il lavoro.

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.