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

84

Quando I chiude il mio MacBook con una sessione SSH attiva in Terminal e poi lo riattiviamo, la richiesta non risponde.

In circa cinque minuti si dice

Write failed: Broken pipe

e termina.

Questo accade anche quando I non digita nulla nel Terminale in circa quindici minuti.

Posso forzare OS X a:

  1. Mantieni attiva la connessione SSH per un periodo di tempo più lungo possibile
  2. Uccidilo immediatamente una volta che non risponde

    
posta Dan 13.01.2012 - 21:29
fonte

6 risposte

105

Per mantenere viva la connessione , puoi verificare in /etc/ssh/ssh_config la riga dove dice ServerAliveInterval , che ti dice quanto spesso (in secondi) il tuo computer invierà un pacchetto nullo a mantenere la connessione attiva. Se c'è uno 0 lì 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 sopra menzionato. Prova a inserire 120 o 240, se sta ancora uccidendo la tua connessione, puoi andare più in basso, forse a 5, se con quel numero non succede, forse è il tuo router che sta scaricando la connessione nella memoria libera.

Per ucciderlo quando si blocca , puoi usare il carattere di escape ssh:

~.

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

    
risposta data 13.01.2012 - 21:58
fonte
18

Puoi:

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

ServerAliveInterval 10

Oppure, per server ~ / .ssh / config

Host keepsdroppingme.com
   ServerAliveInterval 10

Ciò che in pratica invia invia il pacchetto keep alive, ogni 10 secondi ...

    
risposta data 17.12.2015 - 19:01
fonte
8

Puoi anche provare a utilizzare il fantastico progetto mosh . Gestirà con garbo le perdite di rete, le macchine che vanno a dormire, ecc. E ripristinerà felicemente la connessione quando avrai di nuovo una rete funzionante.

Un'altra soluzione più consolidata è quella di utilizzare tmux sul computer remoto. In tal caso potresti ancora ottenere una pipe rotta, ma se ricolleghi la shell e le applicazioni saranno in attesa proprio come le hai lasciate.

    
risposta data 07.11.2013 - 03:12
fonte
3

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 di sistema o di questo utente (e i percorsi sono stranamente diversi).

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

Ciò che ha funzionato per me, su macOS 10.12 Sierra, consiste nel 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!

    
risposta data 09.09.2016 - 03:15
fonte
2

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 wifi o metti il Mac in stop.

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

Ssh automaticamente dopo l'accesso

Jon Stacey ha scritto un post sul blog sull'attivazione automatica di una sessione ssh quando effettui il login.

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

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

  • vai a elementi di accesso in Preferenze di sistema .
  • Aggiungi il tuo flusso di lavoro Automator a Elementi di accesso .
  •     
    risposta data 31.10.2017 - 21:50
    fonte
    1

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

    ServerAliveInterval 60
    TCPKeepAlive yes
    
        
    risposta data 09.08.2016 - 19:23
    fonte

    Leggi altre domande sui tag