Come impedire "Scrittura fallita: conduttura rotta" sulla connessione SSH?

229

Che cosa posso fare per configurare SSH su client e server per evitare errori di Write Failed: broken pipe ? Succede spesso se dormi sul computer client e riprendi più tardi.

    
posta sorin 29.04.2012 - 01:36

9 risposte

209

Ho provato questo in /etc/ssh/ssh_config per Linux e Mac:

Host *
ServerAliveInterval 120

Questa è la frequenza con cui, in secondi, deve inviare un messaggio keepalive al server. Se ciò non funziona, istruisci una scimmia per premere Invio ogni due minuti mentre lavori.

È possibile impostare ServerAliveInterval in /etc/ssh/ssh_config della macchina client o ClientAliveInterval in /etc/ssh/sshd_config della macchina server. Prova a ridurre l'intervallo se ricevi ancora l'errore.

La configurazione per un singolo utente può essere impostata nel file ~/.ssh/config sia sul server che sul lato client. Assicurati che il file abbia le autorizzazioni corrette chmod 644 ~/.ssh/config .

    
risposta data Aram Kocharyan 26.05.2012 - 13:49
70

Le sessioni SSH potrebbero rompersi a causa di numerosi e probabilmente inevitabili motivi.

Un'utilità utile che può essere utilizzata per mitigare i problemi causati da questo è chiamata screen . Screen è una potente utility che ti permette di controllare più terminali che rimarranno in vita indipendentemente dalla sessione ssh. Ad esempio, se esegui screen in una sessione ssh vedrai un nuovo terminale aperto e puoi usarlo per eseguire i lavori. Diciamo che la tua sessione ssh muore durante il processo. L'esecuzione di screen -d e screen -r riaprirà l'ultima sessione e potrai continuare da lì. Assicurati di leggere parte della documentazione prima di utilizzarlo.

    
risposta data eltommo 04.10.2012 - 18:28
40

Configurazione del client

Prova a creare il file:

~/.ssh/config

Aggiungi il contenuto:

Host *
  ServerAliveInterval 30
  ServerAliveCountMax 5

Ora esegui ssh sul tuo server e verifica se il problema è stato risolto. L'opzione ClientAliveInterval è utile solo quando si configura il server ssh (aka sshd), non cambia nulla sul lato client ssh, quindi non usarlo nel file di configurazione sopra.

Questo invierà un segnale ciao-sei-là al server se nessun pacchetto è stato ricevuto nei 30 secondi precedenti (come specificato sopra). Tuttavia, se il numero di segnali consecutivi hello-are-you-there raggiunge ServerAliveCountMax, ssh si disconnetterà dal server. Questo valore è impostato su 3 (quindi 3 * 30 = 90 secondi senza attività del server), aumentarlo se si adatta alle tue esigenze. Ci sono molte più opzioni di configurazione per il file .ssh / config e potresti leggere:

Utilizzo di un file di configurazione SSH

Per ulteriori informazioni su altre opzioni. Potresti non voler applicare questo a tutti i server a cui ti colleghi in questo esempio. O limitalo a un server particolare sostituendo la riga Host * con Host <IP> (sostituisci con un indirizzo IP, vedi la pagina man ssh_config).

Configurazione server

Allo stesso modo puoi dire al server di essere gentile con i tuoi clienti. Il file di configurazione è /etc/ssh/sshd_config .

ClientAliveInterval 20
ClientAliveCountMax 5

Puoi disattivarlo impostando ClientAliveInterval su 0 o tweak ClientAliveInterval e ClientAliveCountMax per impostare l'inattività massima del client ssh senza rispondere alle sonde. Un vantaggio di queste impostazioni su TCPKeepAlive è che i segnali vengono inviati attraverso i canali crittografati, quindi è meno probabile che siano intercettabili.

    
risposta data Matt 06.10.2013 - 04:54
21

Sto aggiornando da remoto un server Ubuntu da lucido a preciso e ho perso la connessione ssh nel mezzo dell'upgrade con il messaggio "Scrivi fallito. Tubo di Brocken". ClientAliveInterval e ServerAliveInterval non hanno fatto nulla. La soluzione è attivare le opzioni di TCPKeepAlive nel client ssh:

TCPKeepAlive yes

in

/etc/ssh/ssh_config
    
risposta data Alexey Sviridov 07.10.2012 - 20:40
18

Per il client, modifica il tuo file ~/.ssh/config (o /etc/ssh/ssh_config ) come segue:

Host *
  TCPKeepAlive yes
  ServerAliveInterval 120
  

TCPKeepAlive : specifica se il sistema deve inviare TCP keepalive   messaggi dall'altra parte. Se vengono inviati, la morte della connessione   o il crash di una delle macchine verrà notato correttamente. Però,   questo significa che le connessioni moriranno se il percorso è temporaneamente fermo,   e alcune persone lo trovano fastidioso (l'impostazione predefinita è 'sì').

     

ServerAliveInterval - Imposta un intervallo di timeout in secondi dopo cui   se nessun dato è stato ricevuto dal server, ssh (1) invierà a   messaggio attraverso il canale crittografato per richiedere una risposta dal   server. Il valore predefinito è 0, a indicare che questi messaggi non saranno   inviato al server.

Per il server, modifica il /etc/ssh/sshd_config come:

ClientAliveInterval 600
ClientAliveCountMax 0

Se vuoi che ssh client esca (timeout) automaticamente dopo 10 minuti (600 secondi).

  

ClientAliveCountMax : indica il numero totale di checkalive   messaggio inviato dal server ssh senza ricevere alcuna risposta dal   client ssh. L'impostazione predefinita è 3.

     

ClientAliveInterval : indica il timeout in secondi. Dopo x   numero di secondi, il server ssh invierà un messaggio al client che chiede   per risposta. Deafult è 0 (il server non invierà messaggi al client a   assegno.).

Vedi anche: Cosa fanno le opzioni ServerAliveInterval e ClientAliveInterval in sshd_config fanno, precisamente?

    
risposta data kenorb 02.10.2014 - 15:52
15

Adoro assolutamente Mosh. Frequento ssh su un server, chiudo il mio laptop e vado in un bar, lo apro e porto avanti come se nulla fosse cambiato.

  

Mosh (shell mobile)

     

Applicazione terminale remota che consente roaming , supporta intermittente   connettività e fornisce locale intelligente   echo e modifica riga dei tasti utente.

     

Mosh è un sostituto di SSH. È più robusto e reattivo,   soprattutto tramite collegamenti Wi-Fi, cellulari e interurbani.

     

Mosh è un software gratuito, disponibile per GNU / Linux, FreeBSD, Solaris, Mac OS X e Android.

    
risposta data Jake 30.09.2014 - 20:48
4

Per me, stavo ottenendo Write failed: Broken pipe anche quando stavo digitando attivamente in vim o al prompt della shell. Non sono riuscito a navigare su Internet localmente neanche per un po '. (Mi collegavo da remoto a Ubuntu usando Terminal.)

Altri nella mia rete trasmettono molti video da Netflix e in altri luoghi. Non posso provarlo, ma ho il sospetto che si tratti di un problema di ISP o router. Ad esempio, Verizon e Netflix puntano le dita l'un l'altro per i problemi di rete dei loro clienti.

Se hai una connessione dial-up e stai trasmettendo video o musica con una connessione SSH o telnet simultanea, è inevitabile che a un certo punto ti venga visualizzato un messaggio di pipe non funzionante. L'aggiornamento del pacchetto a banda larga del mio ISP sembrava rendere la mia connessione interrotta meno frequente.

    
risposta data Parag Magunia 30.07.2014 - 15:33
3

Ho uno script sul server remoto che non sembra mai fallire, indipendentemente dal client o dal server di configurazione SSH.

#!/bin/bash
while true; do date; sleep 10; done;

Salvalo in un file dummy.sh e eseguilo rapidamente prima di ridurre a icona la finestra o allontanarti da essa. Continuerà a stampare il timestamp corrente sul server e manterrà attiva la connessione fino a quando la connessione non verrà rilasciata per nessun altro motivo. Quando torni a quel terminale, premi CTRL + C e continua a lavorare.

    
risposta data JulioHM 09.09.2013 - 18:50
0

Puoi aggiungere questi argomenti ogni volta che invochi ssh: -o ServerAliveInterval=15 -o ServerAliveCountMax=3

Non devi modificare i file / etc / ssh / * config se lo fai.

Puoi creare un alias o una funzione o uno script bash per semplificare la procedura.

es. queste funzioni bash, puoi aggiungere nel tuo .bashrc, do_ssh è usato manualmente per attivare i keepalive. do_ssh_pty è usato all'interno degli script per impostare pty ed evitare i prompt.

do_ssh() {
    ssh -o ServerAliveInterval=15 -o ServerAliveCountMax=3 $*
}

do_ssh_pty() {
    ssh -tt -o "BatchMode=yes" -o "StrictHostKeyChecking=no" -o ServerAliveInterval=15 -o ServerAliveCountMax=3 $*
}

Ora do_ssh [email protected] può essere usato o do_ssh [email protected] <args> <command> e keepalives saranno attivi.

    
risposta data gaoithe 12.02.2018 - 14:05

Leggi altre domande sui tag