Cosa posso fare per configurare SSH sia su client che su server per prevenire Write Failed: broken pipe
errori? Si verifica spesso se si dorme il computer client e si riprende in seguito.
screen
?
Cosa posso fare per configurare SSH sia su client che su server per prevenire Write Failed: broken pipe
errori? Si verifica spesso se si dorme il computer client e si riprende in seguito.
screen
?
Risposte:
Ho provato questo /etc/ssh/ssh_config
per 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 ServerAliveInterval
nel /etc/ssh/ssh_config
computer client o ClientAliveInterval
nel /etc/ssh/sshd_config
server. Prova a ridurre l'intervallo se stai ancora riscontrando l'errore.
La configurazione per un singolo utente può essere impostata nel file ~/.ssh/config
sia sul lato server che sul lato client. Assicurarsi che il file disponga delle autorizzazioni corrette chmod 644 ~/.ssh/config
.
Bad configuration option: ClientAliveInterval
Bad configuration option
errore su OSX 10.8.4.
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 screen
in 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 -d
quindi screen -r
riaprirà l'ultima sessione e potrai continuare da lì. Assicurati di leggere parte della documentazione prima di utilizzarla.
screen -d -r
per recuperare la tua ultima sessione.
screen -dr
. O a screen -x
seconda 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
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 ClientAliveInterval
per 0
o modificare ClientAliveInterval
e ClientAliveCountMax
impostare 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.
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
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_config
come:
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 ServerAliveInterval
e ClientAliveInterval
in sshd_config?
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.
Per me, stavo ottenendo Write failed: Broken pipe
anche 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.
Ho pubblicato la mia risposta qui, poiché non era una VM Ubuntu.
ssh -o IPQoS=throughput user@host
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.
top
correre
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@host
può essere utilizzato o do_ssh user@host <args> <command>
e keepalives sarà attivo.