Come posso impedire che una sessione SSH si blocchi nel terminale OS X?


101

Quando chiudo il mio MacBook con una sessione SSH attiva in Terminale e poi lo riattivo, il prompt non risponde.

In circa cinque minuti dice

Write failed: Broken pipe

e termina.

Questo succede anche quando non scrivo nulla nel Terminale in circa quindici minuti.

Posso forzare OS X a:

  1. Mantieni attiva la connessione SSH il più a lungo possibile
  2. Uccidilo immediatamente quando non risponde

?

Risposte:


121

Per mantenere viva la connessione , puoi controllare nella /etc/ssh/ssh_configriga dove dice ServerAliveInterval, che ti dice quanto spesso (in secondi) il tuo computer invierà un pacchetto null per mantenere viva la connessione. Se hai uno 0 che indica che il tuo computer non sta cercando di mantenere attiva la connessione (è disabilitato), altrimenti ti dice quanto spesso (in secondi) sta inviando il pacchetto di cui sopra. Prova a inserire 120 o 240, se sta ancora uccidendo la tua connessione, puoi abbassare, forse a 5, se con quel numero non succede, forse è il tuo router che sta scaricando la connessione per liberare memoria.

Per ucciderlo quando viene riagganciato , puoi usare il carattere di escape ssh:

~.

Cioè, premere la tilde e quindi il punto, se non funziona, premere Invio prima di premere quello, che interromperà immediatamente la connessione.


3
Ok, puoi interrompere la connessione con ~., ottimo consiglio! Ma cosa fa effettivamente?
Cugina Cocaina,

L'unica cosa di cui ero confuso era che dovevo o no dover ricominciare da sshd, ma sembra che uscire dalla sessione e riconnettersi abbia fatto il trucco
dgig

Spesso il ~. non funziona per me per diversi minuti. Perché?
Sridhar Sarnobat,

2
La posizione di ssh_configè /etc/ssh/ssh_configsu Mac OS X. Modificherei la risposta da solo, ma non ho abbastanza rappresentante su questo sito per farlo.
Erik B,

dovrei metterlo nel client o nel server? Penso che il cliente, ma può essere più chiaro.
EralpB,

23

Puoi:

Configura il tuo sistema, a livello di sistema, per tutte le connessioni Modificando: / etc / ssh / ssh_config E aggiungi la riga:

ServerAliveInterval 10

Oppure, per server ~ / .ssh / config

Host keepsdroppingme.com
   ServerAliveInterval 10

Ciò che fondamentalmente invia invia pacchetto keep alive, ogni 10 secondi ...


9

Puoi anche provare a usare il fantastico progetto mosh . Gestirà con grazia le perdite di rete, le macchine che vanno in sospensione, ecc. E ripristinerà felicemente la connessione quando si dispone di una rete funzionante.

Un'altra soluzione più consolidata è utilizzare tmux sulla macchina remota. In tal caso potresti comunque avere un tubo rotto, ma se ricolleghi la shell e le applicazioni ti aspetteranno proprio come le hai lasciate.


In realtà, è esattamente quello che sto facendo ora.
Dan

5

Le varie risposte qui sono in conflitto per quanto riguarda il percorso esatto dei file di configurazione. Forse è diverso in diversi unix? Suggerisco di leggere le pagine man sul tuo sistema!

In man ssh (1) , cerca il testo: config . Sul mio sistema, ho una scelta di file di configurazione a livello di sistema o di questo utente (ei percorsi sono stranamente diversi).

In man ssh_config (5) , cerca il testo: vivo . Sul mio sistema, sembra che sia necessario impostare sia ServerAliveInterval che ServerAliveCountMax .

Ciò che ha funzionato per me, su macOS 10.12 Sierra, è mettere le seguenti due righe in ~ / .ssh / config:

ServerAliveInterval 20
ServerAliveCountMax 180

Ora posso ssh sul mio server Ubuntu 16.04 senza disconnessione per 20 * 180 secondi = 1 ora. Ha reso la mia giornata!


3

Riconnetti automaticamente ssh dopo l'interruzione del sonno o del wifi

  1. Installa autossh da MacPorts o Homebrew:brew install autossh

  2. Apri Terminale ed esegui autossh -M 20000 -f [SSH ARGUMENTS GO HERE]

  3. Disconnetti il ​​tuo wifi o metti il ​​tuo Mac in stop.

  4. Quando ti riconnetti al wifi, la sessione ssh si riconnetterà automaticamente.


Ssh automaticamente dopo il login

Jon Stacey ha scritto un post sul blog sull'attivazione automatica di una sessione ssh al momento del login.

  1. Installa autossh da MacPorts o Homebrew:brew install autossh

  2. Crea un flusso di lavoro di Automator con uno script bash.

Script della shell di Automator

  1. Vai agli elementi di accesso in Preferenze di Sistema .

Preferenze di Sistema> Elementi di accesso

  1. Aggiungi il flusso di lavoro di Automator agli elementi di accesso .

Articoli di accesso


1

Aggiungi queste due righe a /etc/ssh/ssh_config:

ServerAliveInterval 60
TCPKeepAlive yes

1

Ho appena risolto il problema e aggiungi le seguenti righe $HOME/.ssh/config.

Host *
  ServerAliveInterval 120
  TCPKeepAlive no

L'impostazione TCPKeepAlive nodice al client di presumere che la connessione sia ancora valida fino a prova contraria da una richiesta dell'utente, il che significa che interruzioni temporanee della connessione mentre il termine ssh è inattivo in background non uccideranno la connessione.

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.