2012-05-19 17 views
20

È possibile mantenere in vita la sessione SSH mentre il computer è inattivo? Quando metto il mio Mac (Lion) a dormire per un breve periodo di tempo e poi lo riattivano, la sessione è ancora attiva, ma se la lascio la connessione della sessione notturna è chiusa. setMantieni attiva la sessione SSH mentre il computer dorme?

ho provato:

 
ClientAliveInterval 3600 
ClientAliveCountMax 10 

stesso risultato

Perché sessione "sopravvivere" per un breve periodo di tempo? Come posso controllare questo timeout?

risposta

13

ho trovato la risposta dipende da Impostazioni TCP keepalive:

Per l'elenco delle impostazioni TCP disponibili (FreeBSD 4.8 un su e 5,4):

sysctl -A | grep net.inet.tcp 
  • net.inet.tcp.keepidle - Quantità di tempo, in millisecondi, che la connessione (TCP) deve essere libero prima pr keepalive l'obesità (se abilitata) viene inviata.

  • net.inet.tcp.keepintvl - L'intervallo, in millisecondi, tra sonde keepalive inviate a macchine remote. Dopo l'invio dei probe TCPTV_KEEPCNT (default 8), senza risposta, la connessione (TCP) viene interrotta.

  • net.inet.tcp.always_keepalive - Si supponga che SO_KEEPALIVE sia impostato su tutte le connessioni TCP, il kernel invierà periodicamente un pacchetto all'host remoto per verificare che la connessione sia ancora attiva.

Pertanto formula per calcolare il massimo tempo TCP connessione inattiva segue:

net.inet.tcp.keepidle + (net.inet.tcp.keepintvl x 8) 

il risultato è espresso in millisecondi. Pertanto, impostando

net.inet.tcp.keepidle = 10000 net.inet.tcp.keepintvl = 5000 net.inet.tcp.always_keepalive = 1 (must be 1 always) 

il sistema disconnettere una chiamata quando connessione TCP è morto: 10000 + (5000 x 8) = 50000 msec (50 sec).Per fare in modo che il sistema ricordi queste impostazioni all'avvio, è necessario aggiungerle al file /etc/sysctl.conf

+2

È applicabile sul lato server? – netvope

+0

non l'ho ancora provato, ma penso di sì, lato server: [TCP Keepalive] (http://jampad.net/Library/tcpipprot/ch17.html): Se l'utente dovesse stabilire la connessione, fare un po 'di lavoro, quindi spegnere il computer alla fine della giornata, senza disconnettersi, una connessione semiaperta sarebbe lasciata. Se il client scompare, lasciando la connessione semiaperta sul lato server e il server attende alcuni dati dal client, il server attenderà per sempre. La funzione keepalive ha lo scopo di rilevare queste connessioni semiaperte dal lato server. –

+0

è possibile avere un proxy per il mio sistema letto che potrebbe continuare a inviare pacchetti al server? In questo modo la sessione potrebbe essere mantenuta in vita anche dopo il sonno. – sudeepdino008

1

A volte, le sessioni vengono chiuse quando non vengono trasmessi dati. L'apertura di htop in genere impedisce la chiusura delle connessioni ssh, oltre a fornire informazioni utili in tempo reale.

Keepalive dovrebbe fare la stessa cosa. Potresti forse provare a ridurre l'intervallo (il ritardo tra due keepalive) a qualcosa come 60, vedere se cambia qualcosa.

+0

Se il computer non dorme, le sessioni SSH vanno bene, ma voglio riutilizzare la stessa sessione dopo che si è svegliata dopo aver dormito. Funziona per un breve periodo di sonno, ma non per molto. –

+1

Probabilmente non è possibile mantenere aperta la sessione ssh durante la sospensione - keepalive non verrà inviato se il computer sta dormendo. Lo schermo è la strada da percorrere: http://www.gnu.org/software/screen/ – Gyscos

6

Se si desidera una soluzione elegante per mantenere attiva una sessione remota, è necessario verificare l'utilità screen. Quando si utilizza questa utility è possibile mantenere i programmi in esecuzione anche dopo aver disconnesso o arrestato il computer. Quindi è possibile ricollegare la sessione disponibile screen in seguito.

Lo schermo richiede un po 'di tempo per imparare le basi, ma quando ne avrai il controllo, vedrai quanto è potente.

È possibile controllare questo link per un tutorial sull'utilizzo di schermo: http://www.thegeekstuff.com/2010/07/screen-command-examples/

+0

In effetti una soluzione elegante, ma non rispondere alla mia domanda. Grazie per il suggerimento, farò un tentativo. –

+5

Preferisco l'alternativa più recente [tmux] (https://tmux.github.io/). –

+0

http://bphogan.com/2012/06/15/tmux/ –

5

Un'altra possibile soluzione è mosh, che non è esattamente SSH ma mantiene attiva la connessione della shell quando il computer va in stop o anche dopo aver cambiato Indirizzi IP

+3

Il problema con 'mosh' è che richiede una vasta gamma di porte UDP da aprire sul firewall. Questo è un problema per molte persone. – e40

+0

tecnicamente, è possibile 'sshuttle' il traffico UDP sulla sessione ssh, e quindi avviare' mosh' – danbst

2

Un'altra soluzione è l'utilizzo di autossh, che controlla essenzialmente la sessione ssh e si riconnette non appena viene interrotta (ad esempio dopo un ciclo di sospensione, ma anche se si perde una connessione WiFi per un po ', per esempio). Questo funziona particolarmente bene per le porte di inoltro/tunnel ssh.

Ecco un tutorial: http://linuxaria.com/howto/permanent-ssh-tunnels-with-autossh.

Problemi correlati