Mantieni viva la sessione SSH [chiuso]


242

Uso ssh -p8520 username@remote_hostper accedere al server remoto.

Problema :

È sempre collegato e funziona correttamente quando sono sul posto di lavoro. Sfortunatamente, il terminale si blocca in 10-15 minuti dopo che mi sono connesso al server remoto da casa.

Non ci sono rapporti di errore / timeout sulla console ma il cursore non può più spostarsi.

Quando invio wper controllare gli utenti di login, ci sono alcuni utenti di login di zombi e li devo uccidere manualmente.

Questo è abbastanza fastidioso. Qualcuno può aiutarmi?


Ho avuto anche questo, ho iniziato a usare screen. Forse questo è un problema di timeout.
martin

@martin screenaiuta a mantenere il programma in esecuzione. Purtroppo a volte devo lavorare sul server remoto :(
Haifeng Zhang

Se lo avvii senza parametri, questo ti dà una shell.
martin

Stai screensolo dicendo ? Può risolvere il problema di connessione persa? No screen -S screenName? Uso sempre lo schermo con -Se-r
Haifeng Zhang

1
No, questo non risolve il problema, eviti solo di perdere il tuo lavoro nel terminale. Se non fai nulla, si bloccherà comunque, puoi riprendere da dove hai iniziato. Volevo dire che puoi creare un terminale che puoi sempre riprendere usando screen. Sembra che tu lo sappia già;)
martin

Risposte:


451

Il demone ssh (sshd), che gira sul lato server, chiude la connessione dal lato server se il client diventa silenzioso (cioè, non invia informazioni). Per prevenire la perdita di connessione, indicare al client ssh di inviare un segnale di vita al server una volta ogni tanto.

La configurazione per questo è nel file $HOME/.ssh/config, crea il file se non esiste (il file di configurazione non deve essere leggibile dal mondo, quindi esegui chmod 600 ~/.ssh/configdopo aver creato il file). Per inviare il segnale ogni quattro minuti (240 secondi) all'host remoto, inserire quanto segue nel file di configurazione:

Host remotehost
    HostName remotehost.com
    ServerAliveInterval 240

Per abilitare l'invio di un segnale keep-alive per tutti gli host, inserire i seguenti contenuti nel file di configurazione:

Host *
    ServerAliveInterval 240

24
@ user271996, perché si dovrebbe riavviare un demone per un'impostazione sul lato client?
maxschlepzig,

La configurazione deve essere solo scrivibile dall'utente. la leggibilità non è un problema. L'uso di 600 come livello di autorizzazione va bene poiché è scrivibile solo dall'utente.
jbruni,

1
nel caso in cui non sia ovvio che questo file di configurazione sia sul tuo PC / Linux box
zzapper

5
Mi confondo sempre il nome della configurazione: il client usa ServerAliveInterval mentre il server usa ClientAliveInterval . Che casino.
Youkaichao,

@youkaichao C'è spesso questa confusione. Come designer API, ci sono ragioni per cui potrei metterlo in entrambi i modi. In definitiva, ciò che è più critico, è una buona documentazione dello standard scelto.
Cameron Tacklind,

171

Volevo una soluzione unica:

ssh -o ServerAliveInterval=60 myname@myhost.com

Memorizzato in un alias:

alias sshprod='ssh -v -o ServerAliveInterval=60 myname@myhost.com'

Ora puoi connetterti in questo modo:

me@MyMachine:~$ sshprod

12
È fantastico, ma non è esattamente una "soluzione unica". Se hai intenzione di connetterti al server più di una volta, perché non fare Host *& ServerAliveInterval 240(o specificare il nome host, se lo desideri solo myname@myhost.comcome nella risposta di rockymonkey555? Impostare un alias non sembra in alcun modo più facile.
Lambart

8
Oppure crea un alias nel tuo ~ / .bashrc:alias ssh='ssh -o ServerAliveInterval=60'
Jabba

15
Intende "una volta" come in "funziona solo una volta", non "Devo scriverlo solo una volta".
Jonathan Hartley,

1
Sì, se leggi "una volta" come "monouso", questo funziona perfettamente.
philraj,

Se si vuole un "one-liner" che le serie ServerAliveIntervala 60, grande. Tuttavia, usare un alias bash quando potresti usarlo .ssh/configè semplicemente stupido.
Cameron Tacklind,

50

Per quelli che si chiedono, @ Edward-Coast

Se vuoi impostare keep keep per il server , aggiungi questo a /etc/ssh/sshd_config:

ClientAliveInterval 60
ClientAliveCountMax 2

ClientAliveInterval : imposta un intervallo di timeout in secondi dopo il quale se non sono stati ricevuti dati dal client, sshd (8) invierà un messaggio attraverso il canale crittografato per richiedere una risposta dal client.

ClientAliveCountMax : imposta il numero di messaggi attivi del client (vedere di seguito) che possono essere inviati senza che sshd (8) riceva alcun messaggio dal client. Se questa soglia viene raggiunta durante l'invio dei messaggi attivi del client, sshd disconnetterà il client, terminando la sessione.


Sembra che non esista un "parametro" come ClientAliveInterval, solo ServerAliveInterval, è possibile controllare nella pagina di manuale "man ssh_config"
dtj

6
Quello è sbagliato, cerca "man sshd_config" per la parte del server che esegue il demone ssh, non la configurazione del client.
Jeff Davenport,

Devo usare ClientAliveIntervalper consentire al server di verificare la presenza del client o devo lasciare che il client "esegua il ping" ServerAliveIntervalripetutamente con il server ? Entrambi sembrano non avere senso
qrtLs

1
Impostare il ClientAliveIntervalserver solo se si desidera che il server si disconnetta su connessioni morte che non rispondono e che è possibile personalizzare la frequenza e quando ciò accade.
Jeff Davenport,


10

Possiamo mantenere viva la nostra connessione ssh seguendo le configurazioni globali

Aggiungi la seguente riga al /etc/ssh/ssh_configfile:

ServerAliveInterval 60

Funziona solo per il client o funziona anche per sshd?
Edward Coast,

1
@EdwardCoast Funziona sul computer client. L'ho provato su Mac
minhas23,
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.