Modo per evitare il timeout della connessione ssh e il blocco del terminale GNOME


235

Quando mi connetto via ssh a determinati server, il timeout e "congela" il terminale (non accetta input, non si disconnette, Ctrl-C non può uccidere il processo ssh o altro).

Questo è in Ubuntu, gnome-terminalanche se sembra mettere in pausa l'ingresso / uscita del terminale e non influisce sul funzionamento del software GNOME Terminal stesso. Quindi meno un bug gnome-terminalche una fastidiosa incoerenza con ssh.

Quindi, c'è un modo per impedire / riguadagnare il terminale da connessioni ssh che sono scadute?


Risposte:


256

sshd (il server) chiude la connessione se non sente nulla dal client per un po '. Puoi dire al tuo client di inviare un segnale di segno vitale al server una volta ogni tanto.

La configurazione per questo è nel file ~/.ssh/config. Per inviare il segnale ogni quattro minuti a remotehost, inserire quanto segue nel proprio ~/.ssh/config.

Host remotehost
  HostName remotehost.com
  ServerAliveInterval 240

Questo è quello che ho nel mio ~/.ssh/config.

Per abilitarlo per tutti gli host utilizzare:

Host *
  ServerAliveInterval 240

Assicurati anche di eseguirlo chmod 600 ~/.ssh/config, perché il file di configurazione non deve essere leggibile in tutto il mondo.


1
Grazie sblair per avermi aiutato con la formulazione, è molto apprezzato. Ho cambiato "non dovrei" tornare a "no" perché ssh controlla i permessi del file e se è leggibile da un mondo o da un gruppo non riesce.
Ludwig Weinzierl,

1
Questo non è ciò che l'OP ha chiesto. Non viene espulso a causa dell'inattività. Sta tentando di connettersi e il suo terminale si sta congelando.
Cerin,

Dov'è questo ~/.ssh/config?
Utente

1
@User '~ /' rappresenta la cartella principale. '.ssh' è una cartella all'interno della cartella principale.
wkm,

6
questo è inutile se la tua connessione si sta effettivamente perdendo ...
so12311

248

Premete Enter, ~, .uno dopo l'altro a disconnettere da una sessione congelato.

La sezione "ESCAPE CHARACTERS" nella pagina man di ssh spiega i dettagli sottostanti.


40
Questa risposta mi sembra rispondere in modo più accurato alla domanda e, in ogni caso, è stata la risposta che stavo cercando.
CoatedMoose

Nota che devi decommentare la linea EscapeChar ~in /etc/ssh/ssh_config(o ~/.ssh/ssh_configse preferisci).
Aditya MP

@adityamenon No, EscapeChar ~è già predefinito predefinito.
Peter Eisentraut,

2
@Segna la domanda "c'è un modo per impedire di riguadagnare il terminale dalle connessioni ssh che sono scadute ?" Enfasi mia.
CoatedMoose

2
Anche se non era corretto nel contesto della domanda, questo è esattamente quello che volevo.
Sottomarino Sebastian,

38

Anche se questa non è una risposta diretta alla tua domanda, è fortemente correlata al problema che hai. Invece di provare a mantenere attiva la connessione (tutte le connessioni alla fine muoiono) è possibile utilizzare i multiplexor del terminale, come screene tmuxche mantengono attiva la sessione in background anche se il terminale viene disconnesso.

Essenzialmente quando si accede al server SSH si esegue immediatamente screenche creerà e allegherà una nuova sessione:

$ screen

Quindi vai avanti e fai il tuo lavoro con la shell come faresti normalmente. Ora se la connessione viene interrotta, quando puoi tornare online e riconnetterti al server tramite SSH, ottieni un elenco con le sessioni correnti con:

$ screen -ls

Per ricollegarsi a una sessione:

$ screen -r <session>

dove si <session>trova il PID o il nome di una sessione. Verrai ricollegato alla sessione e potrai continuare da dove avevi interrotto!

Puoi anche staccare la sessione e riconnetterti da casa per riprendere dal punto esatto in cui eri rimasto. Per staccare la sessione che usi C-aseguita da C-d(questo è Control + Ae poi Control + D).

C'è anche un semplice tutorial online .

Utilizzando screene tmuxsu server remoti è considerato un best practice ed è altamente raccomandato . Alcune persone screenarrivano ad avere come shell di login predefinita, quindi quando si connettono iniziano immediatamente una nuova screensessione.


2
un'altra alternativa è usare mosh: mosh.mit.edu
Zombies il

Ciò è particolarmente utile se si utilizza un hotspot o un wifi che occasionalmente si interrompe.
Randall,

11

Prova ad aggiungere -o ServerAliveInterval=30alla tua stringa di connessione ( 30significa 30 secondi e ovviamente può essere regolato)



1

Per le persone che vogliono impedire al client di scadere in primo luogo.

Potresti provare a impostare ConnectTimeout 0nel file di configurazione. Il valore 0 indica che la connessione verrà mantenuta in vita indefinitamente a meno che non venga chiusa.

il tuo file config (o ssh_config) potrebbe assomigliare a questo:

Host *
   ConnectTimeout 0
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.