sviluppo-web-qa.it

Come riconnettersi a una sessione ssh disconnessa

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 trovarsi nel mezzo di alcune azioni (modifica dei file, esecuzione di alcuni processi, ecc ...) che devo ripristinare, piuttosto che riavviare, se possibile.

164
palehorse

AGGIORNAMENTO: per una risposta effettiva vedi la risposta di zero_r di seguito

Questa non è una risposta, ma una soluzione alternativa. Usa 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 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.

142
kbyrd

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.

134
zero_r

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
    
  • Disconnettiti dalla sessione dello schermo: CTRL-Ad

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

    $ screen -d -r
    
  • Apri un'altra finestra 'finestra': CTRL-Ac

  • Scorri le finestre dello schermo aperto: CTRL-Aspace

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

64
Mike Pountney

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 Android mobile, è un salvavita quando viaggio e SSH. Lo stesso è vero sul mio laptop quando legato con il cellulare sul treno per esempio Consiglio di compilare dal sorgente per ottenere l'ultima versione, la versione repository per me all'interno di Ubuntu presenta alcuni fastidi che sono stati corretti nella versione più recente (al momento della scrittura).

Mosh (mobile shell)

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, incluse SSH e app Web come Gmail Mosh è diverso.

  • Realizza sogni d'oro : Con Mosh, puoi mettere il laptop in modalità sleep 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.

47
jwbensley

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 rscreen fornito con autossh)

20
hayalci

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.

14
Jacksonkr

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.

10
wzzrd

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).

4
David Spillett

Ecco un'altra soluzione senza 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 (completamente open source) di PuTTY 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".

3
munkiepus

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
cepal

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

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

2
David

A volte mi sono dimenticato di eseguire anche lo schermo e di perdere il 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 si stava facendo grazie a reptyr.

Dopo una disconnessione accidentale da una sessione SSH, la prima cosa da fare è eseguire screen per non interrompere nuovamente la connessione. Quindi nella nuova sessione, esegui 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.

2
march_happy