Come impedire “Scrittura fallita: pipe rotta” sulla connessione SSH?

Cosa posso fare per configurare SSH su client e server per impedire la Write Failed: broken pipe errori di Write Failed: broken pipe ? Succede spesso se si dorme il computer client e si riprende più tardi.

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

 Host * ServerAliveInterval 120 

Questo è quanto spesso, in secondi, dovrebbe inviare un messaggio keepalive al server. Se ciò non funziona, istruisci una scimmia per premere Invio ogni due minuti mentre lavori.

È ansible 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 lato server che client. Assicurati che il file abbia le autorizzazioni corrette chmod 644 ~/.ssh/config .

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 si esegue lo screen in una sessione ssh, verrà visualizzato un nuovo terminale aperto e sarà ansible utilizzarlo per eseguire i lavori. Diciamo che la tua sessione ssh muore durante il processo. Lo screen -d esecuzione screen -d quindi lo screen -r riaprirà l’ultima sessione e sarai in grado di continuare da lì. Assicurati di leggere un po ‘della documentazione prima di usarla.

Configurazione del client

Prova a creare il file:

 ~/.ssh/config 

Aggiungi i contenuti:

 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.

Ciò 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 altre opzioni di configurazione per il file .ssh / config e potresti leggere:

Utilizzando un file di configurazione SSH

Per maggiori informazioni su altre opzioni. Potresti non voler applicare questo a tutti i server a cui ti colleghi in questo esempio. Oppure trattenerlo solo su un server particolare sostituendo la linea Host * con Host (sostituirlo con un indirizzo IP, vedere la pagina man ssh_config).

Configurazione del 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 

È ansible distriggersrlo impostando ClientAliveInterval su 0 o modificando 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 sia intercettabile.

Sto aggiornando da remoto un server Ubuntu da shiny a preciso e ho perso la connessione ssh nel mezzo dell’aggiornamento con il messaggio “Scrivi fallito. Tubo di Brocken”. ClientAliveInterval e ServerAliveInterval non hanno fatto nulla. La soluzione è triggersre le opzioni TCPKeepAlive nel client ssh:

 TCPKeepAlive yes 

in

 /etc/ssh/ssh_config 

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 messaggi keepalive TCP all’altro lato. Se vengono inviati, la morte della connessione o l’arresto anomalo di una delle macchine verranno notati correttamente. Tuttavia, ciò significa che le connessioni moriranno se il percorso è temporaneamente inattivo e alcune persone lo troveranno fastidioso (l’impostazione predefinita è “sì”).

ServerAliveInterval – Imposta un intervallo di timeout in secondi dopo il quale se non sono stati ricevuti dati dal server, ssh (1) invierà un messaggio attraverso il canale crittografato per richiedere una risposta dal server. Il valore predefinito è 0, a indicare che questi messaggi non verranno inviati al server.


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

 ClientAliveInterval 600 ClientAliveCountMax 0 

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

ClientAliveCountMax – Indica il numero totale di messaggi di checkalive inviati dal server ssh senza ricevere alcuna risposta dal client ssh. L’impostazione predefinita è 3.

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


Vedi anche: Che cosa fanno ClientAliveInterval le opzioni ServerAliveInterval e ClientAliveInterval in sshd_config?

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 il roaming , supporta la connettività intermittente e fornisce l’intelligente eco locale e la modifica delle linee 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.

Per quanto mi riguarda, stavo scrivendo Write failed: Broken pipe anche quando stavo digitando triggersmente in vim o al prompt della shell. Non sono riuscito a navigare su Internet localmente neanche per un po ‘di tempo. (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 meno frequente la mia connessione interrotta.

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à triggers 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.

È ansible aggiungere questi argomenti ogni volta che si richiama ssh: -o ServerAliveInterval=15 -o ServerAliveCountMax=3

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

Puoi creare un alias bash o una funzione o uno script per renderlo semplice.

Ad es. Queste funzioni bash, puoi aggiungere nel tuo .bashrc, do_ssh è usato manualmente per triggersre i keepalive. do_ssh_pty viene utilizzato 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] e keepalives sarà attivo.