Domanda Come impedire "Scrittura fallita: pipe rotta" sulla connessione SSH?


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


232
2018-04-28 23:36


origine


Niente. La sessione è stata interrotta e la sicurezza della sessione è stata compromessa. Se non si mette il comp a dormire, è possibile impostare un tempo di keep alive per il client per sparare a un battito cardiaco permanente sul server, ma se il sistema sta andando a dormire non c'è nulla che possa essere fatto. - darkdragn
In questo caso sto cercando qualcosa che mi permetta di riavviare una connessione ssh rotta (basata probabilmente sul codice di uscita) e ripristinare usando screen? - sorin
Le persone si sbagliano: ho due macchine client desktop che si connettono 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. Il resto delle funzioni di rete nella macchina non vengono interrotte. Quindi no, non si tratta né di un problema di rete, né di un problema del server, ma di un problema software specifico di CLIENT SSH, che può essere risolto, al contrario di ciò che "darkdragan" osa dire, che "non si può fare nulla". - David L
E infatti, come ho detto: la gente parla troppo quando dice "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 Quantal Ubuntu 12.10, avevo applicato quell'istruzione in quel file [ho appena controllato], due anni fa, e quello 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, la gente: trattenetevi quando osate pensare che "non si può fare nulla", e trattenetevi ancora di più quando cercate di lasciare quel messaggio ad altre persone. - David L
@DavidL dovresti leggere meglio le domande prima di scagliare. Il tuo problema non è lo stesso degli OP, che menziona chiaramente mettere a riposo il computer. Che tra l'altro solo una delle risposte indirizzo ("mosh"), ed è stata pubblicata 2 anni dopo la domanda. Tuttavia le altre risposte fanno la cosa migliore, che propone soluzioni ai casi che possono essere risolti più facilmente, come il tuo. Rilassati, non essere così stressato, fare baldoria non fa bene qui intorno ... - msb


risposte:


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.

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


211
2018-05-26 11:49



Sì, lo faccio in modo simile e funziona abbastanza bene per la maggior parte delle cose. - Oli♦
Non sono su un Mac, ma su Ubuntu 12.04 e il file per questo sistema operativo sembra essere ~ / .ssh / config. - H2ONaCl
OS X 10.8.4 dà un errore Bad configuration option: ClientAliveInterval - ohho
Lo capisco Bad configuration option errore su OSX 10.8.4. - Nick Heiner
Generalmente, 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


Le sessioni SSH potrebbero rompersi a causa di numerosi e probabilmente 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 permette di controllare più terminali che rimarranno in vita indipendentemente dalla sessione ssh. Ad esempio, se corri 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. In esecuzione screen -d poi screen -r riaprirà l'ultima sessione e potrai continuare da lì. Assicurati di leggere parte della documentazione prima di usarlo.


70
2017-10-04 16:28



Questa è probabilmente la migliore risposta, non sono sicuro del motivo per cui non è votato più in alto. Le altre "correzioni" sono utili nel caso particolare in cui ci si preoccupa veramente di mantenere una connessione SSH, ma nella maggior parte dei casi d'uso immagino che la vera preoccupazione sia che i processi previsti continuino a funzionare, indipendentemente da eventuali problemi di connessione client / server. . - Paul McMurdie
Vorrei anche aggiungere tmux come alternativa allo schermo. Lo trovo più versatile e stabile rispetto allo schermo. - fridaymeetssunday
lasciandolo qui per riferimenti futuri, puoi farlo comodamente screen -d -r per recuperare la tua ultima sessione. - doplumi
O semplicemente screen -dr. O screen -x a seconda di cosa hai intenzione di fare. Il punto è che uno dovrebbe sapere che cosa fanno tutti questi interruttori, in modo che uno possa usare quelli appropriati e non solo seguire ciecamente i suggerimenti di internet. C'è un bel riassunto compatto disponibile qui: ss64.com/bash/screen.html - flith


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. O trattenerlo solo su un server particolare sostituendo la linea Host * con Host <IP> (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

Puoi disattivarlo impostando ClientAliveInterval a 0 o modificare ClientAliveInterval e ClientAliveCountMax per impostare un massimo di inattività 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.


40
2017-10-06 02:54



Non funziona. Sto affrontando di nuovo lo stesso errore. - user997704
Provalo direttamente dalla riga di comando e vai più in basso: ssh -o ServerAliveInterval = 5 user @ host - Matt
Ho provato anche quello ... non funziona. Non so davvero cosa stia succedendo al mio sistema - user997704
È ClientAliveCountMax, NOT ClientAliveMaxCount - David G
@DavidG Modifica la risposta con le tue correzioni. - CivMeierFan


Sto aggiornando da remoto un server Ubuntu da lucido 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 è attivare le opzioni TCPKeepAlive nel client ssh:

TCPKeepAlive yes

in

/etc/ssh/ssh_config

22
2017-10-07 18:40





Per il cliente, 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 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 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 checkalive   messaggio inviato dal server ssh senza ricevere alcuna risposta dal   client ssh. L'impostazione predefinita è 3.

ClientAliveInterval - Questo 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   dai un'occhiata.).


Guarda anche: Cosa offrono le opzioni ServerAliveInterval e ClientAliveInterval in sshd_config do, precisamente?


18
2017-10-02 13:52





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 intelligente Locale   eco e la modifica della riga delle sequenze di tasti dell'utente.

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

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


15
2017-09-30 18:48





Per me, stavo diventando 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 '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.


4
2017-07-30 13:33