Come prevenire "Write Failed: broken pipe" sulla connessione SSH?


283

Cosa posso fare per configurare SSH sia su client che su server per prevenire Write Failed: broken pipeerrori? Si verifica spesso se si dorme il computer client e si riprende in seguito.


8
Niente. La sessione è stata interrotta e la sicurezza della sessione è stata compromessa. Se non si mette in pausa il comp, è possibile impostare un tempo di mantenimento per consentire al client di inviare un battito cardiaco al server, ma se il sistema va in modalità di sospensione, non è possibile eseguire alcuna operazione.
darkdragn,

3
In questo caso sto cercando qualcosa che mi consenta di riavviare una connessione ssh interrotta (probabilmente basata sul codice di uscita) e ripristinare usando screen?
sorin,

4
Voi avete torto: ho DUE macchine client desktop connesse al server SAME. Uno è Ubuntu 12.10, Quantal, il cui client SSH funziona bene e mantiene la connessione per ore. L'altro è Ubuntu 14.10, Utopic, a parte l'altro e in una nuova installazione; dopo un paio di minuti, si blocca con questo messaggio. Le altre funzioni di rete nella macchina non vengono interrotte. Quindi no, non è né un problema di rete, né un problema del server, ma uno specifico problema del software SSH CLIENT, che PUO 'essere risolto, al contrario di ciò che "darkdragan" osa dire, che "non si può fare nulla".
David L

2
E infatti, come ho detto: le persone parlano troppo quando dicono "non si può fare nulla", proprio come osava @darkdragn. Ho letto la risposta di Aram Kocharyan e l'ho applicata: 20 minuti fa ... Mi sono reso conto che nel mio vecchio Ubuntu 12.10 Quantal, avevo applicato quell'istruzione in quel file [ho appena controllato], due anni fa, ed era la ragione della stabilità lì. L'ho fatto qui e in questi ultimi 20 minuti la connessione è rimasta stabile da allora. Quindi, per favore, gente: astenetevi voi stessi quando avete il coraggio di pensare che "nulla può essere fatto", e trattenetevi ancora di più quando provate a lasciare quel messaggio ad altre persone.
David L

11
@DavidL dovresti leggere meglio le domande prima di eseguire il ranting. Il tuo problema non è lo stesso degli OP, che menziona chiaramente mettere il computer in sospensione. Che tra l'altro solo una delle risposte si rivolge ("mosh"), ed è stato pubblicato 2 anni dopo la domanda. Tuttavia, le altre risposte fanno la cosa migliore successiva, che propone soluzioni a casi che possono essere risolti più facilmente, come la tua. Rilassati, non essere così stressato, il ranting non fa nulla di buono da queste parti ...
msb

Risposte:


266

Ho provato questo /etc/ssh/ssh_configper Linux e Mac:

Host *
ServerAliveInterval 120

Questo è quanto spesso, in pochi secondi, dovrebbe inviare un messaggio keepalive al server. Se il problema persiste, allena una scimmia a premere Invio ogni due minuti mentre lavori.

È possibile impostare ServerAliveIntervalnel /etc/ssh/ssh_configcomputer client o ClientAliveIntervalnel /etc/ssh/sshd_configserver. Prova a ridurre l'intervallo se stai ancora riscontrando l'errore.

La configurazione per un singolo utente può essere impostata nel file ~/.ssh/configsia sul lato server che sul lato client. Assicurarsi che il file disponga delle autorizzazioni corrette chmod 644 ~/.ssh/config.


4
Non sono su un Mac, ma Ubuntu 12.04 e il file per questo sistema operativo sembrano essere ~ / .ssh / config.
H2ONaCl

5
OS X 10.8.4 dà un erroreBad configuration option: ClientAliveInterval
ohho il

3
Ottengo lo stesso Bad configuration optionerrore su OSX 10.8.4.
Nick Heiner,

10
In genere, questi due comandi vengono inseriti in diverse parti del sistema. Solo ServerAliveInterval sul lato client OSX ... e solo ClientAliveInterval sul file di configurazione sshd ...
ftrotter

2
La mia scimmia mi ha detto: "Perché non ti digiti" top [INVIO] "
agosto

85

Le sessioni SSH possono interrompersi a causa di numerosi e forse inevitabili motivi.

Viene chiamata un'utilità utile che può essere utilizzata per mitigare i problemi causati da questo screen. Screen è una potente utility che ti consente di controllare più terminali che rimarranno in vita indipendentemente dalla sessione ssh. Ad esempio, se si esegue screenin una sessione ssh, verrà aperto un nuovo terminale e sarà possibile utilizzarlo per eseguire i lavori. Diciamo che la tua sessione SSH muore nel processo. L'esecuzione screen -dquindi screen -rriaprirà l'ultima sessione e potrai continuare da lì. Assicurati di leggere parte della documentazione prima di utilizzarla.


5
Questa è probabilmente la risposta migliore, non sono sicuro del perché non sia stato votato più in alto. Le altre "correzioni" sono utili nel caso speciale in cui ti interesserebbe davvero mantenere una connessione SSH, ma nella maggior parte dei casi d'uso immagino che la vera preoccupazione sia che i processi previsti continuano a funzionare, indipendentemente da qualsiasi problema di connessione client / server .
Paul McMurdie,

16
Vorrei anche aggiungere Tmux in alternativa allo schermo. Lo trovo più versatile e stabile dello schermo.
venerdì domenica

2
lasciandolo qui per riferimento futuro, puoi eseguire comodamente screen -d -rper recuperare la tua ultima sessione.
doplumi,

2
O semplicemente screen -dr. O a screen -xseconda di cosa stai pensando di fare. Il punto è che si dovrebbe sapere cosa fanno tutti quegli interruttori, in modo da poter usare quelli appropriati e non solo seguire ciecamente i suggerimenti delle persone su Internet. C'è un bel riassunto compatto disponibile qui: ss64.com/bash/screen.html
flith

Questa non è una risposta al problema
user3728501

46

Configurazione client

Prova a creare il file:

~/.ssh/config

Aggiungi il contenuto:

Host *
  ServerAliveInterval 30
  ServerAliveCountMax 5

Ora ssh sul tuo server e vedi se il tuo 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 di saluto al server se non sono stati ricevuti pacchetti nei 30 secondi precedenti (come specificato sopra). Tuttavia, se il numero di segnali hello-are-you-there consecutivi raggiunge ServerAliveCountMax, allora ssh si disconnetterà dal server. Il valore predefinito è 3 (quindi 3 * 30 = 90 secondi senza attività del server), aumentalo se soddisfa le tue esigenze. Ci sono molte più opzioni di configurazione nel file .ssh / config e puoi 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 connetti a cui questo esempio farà. Oppure limitalo a un determinato server sostituendo la riga Host *con Host <IP>(sostituisci con un indirizzo IP, vedi 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

È possibile disattivarla impostando ClientAliveIntervalper 0o modificare ClientAliveIntervale ClientAliveCountMaximpostare un massimo di inattività 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 spoofable.


Non funziona Sto affrontando di nuovo lo stesso errore.
user997704,

3
Provalo direttamente dalla riga di comando e vai in basso: ssh -o ServerAliveInterval = 5 user @ host
Matt

Ho provato anche quello..non funziona. Davvero non so cosa stia succedendo con il mio sistema
user997704

2
È ClientAliveCountMax, NON ClientAliveMaxCount
David G

@DavidG Modifica la risposta con le tue correzioni.
CivMeierFan,

23

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

TCPKeepAlive yes

nel

/etc/ssh/ssh_config

20

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

Host *
  TCPKeepAlive yes
  ServerAliveInterval 120

TCPKeepAlive : specifica se il sistema deve inviare messaggi keepalive TCP dall'altro lato. Se vengono inviati, la morte della connessione o l'arresto anomalo di una delle macchine verrà notata correttamente. Tuttavia, ciò significa che le connessioni moriranno se il percorso è temporaneamente inattivo e alcune persone lo trovano fastidioso (il valore predefinito è "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_configcome:

ClientAliveInterval 600
ClientAliveCountMax 0

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

ClientAliveCountMax - Indica il numero totale di messaggi checkalive inviati 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 per chiedere una risposta. Deafult è 0 (il server non invierà un messaggio al client per verificare).


Vedi anche: Cosa fanno esattamente le opzioni ServerAliveIntervale ClientAliveIntervalin sshd_config?


L'impostazione di ServerAliveCountMax su un valore superiore al valore predefinito sul client dovrebbe anche aiutare a mantenere attiva la connessione per connessioni lente.
jonnyjandles,

17

Adoro assolutamente Mosh. Frequento spesso un server, chiudo il mio laptop e vado in un bar, lo apro e continuo come se nulla fosse cambiato.

Mosh (shell mobile)

Applicazione terminale remota che consente il roaming , supporta la connettività intermittente e fornisce l'eco locale intelligente e la modifica della linea delle sequenze di tasti dell'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.


6

Per me, stavo ottenendo Write failed: Broken pipeanche quando stavo digitando attivamente vim o al prompt della shell. Neanche per un po 'ho potuto navigare in Internet localmente. (Mi stavo collegando in remoto a Ubuntu usando Terminal.)

Altri nella mia rete trasmettono molti video da Netflix e altri luoghi. Non posso provarlo, ma sospetto che sia un problema con ISP o router. Ad esempio, Verizon e Netflix si stanno puntando le dita a vicenda per i problemi di rete dei propri clienti.

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



3

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

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

Salvalo in un file dummy.sh ed 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 finché la connessione non viene interrotta per nessun altro motivo. Quando torni a quel terminale, premi CTRL + C e continua a lavorare.


9
o semplicemente lasciare topcorrere
Eben Geer,

1

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

In questo caso non è necessario modificare i file / etc / ssh / * config.

È possibile creare un alias bash o una funzione o uno script per rendere tutto più semplice.

Ad esempio queste funzioni bash, è possibile aggiungere nel proprio .bashrc, do_ssh viene utilizzato manualmente per attivare keepalive. do_ssh_pty viene utilizzato negli 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 user@hostpuò essere utilizzato o do_ssh user@host <args> <command>e keepalives sarà attivo.

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.