Cómo evitar que "Escritura fallida: tubería rota" en la conexión SSH?

230

¿Qué puedo hacer para configurar SSH en el cliente y los servidores para evitar Write Failed: broken pipe errors? A menudo ocurre si duerme su computadora cliente y se reanuda más tarde.

    
pregunta sorin 28.04.2012 - 23:36

9 respuestas

211

Intenté esto en /etc/ssh/ssh_config para Linux y Mac:

Host *
ServerAliveInterval 120

Esta es la frecuencia con la que, en segundos, debe enviar un mensaje de keepalive al servidor. Si eso no funciona, entrena a un mono para presionar Enter cada dos minutos mientras trabajas.

Puede establecer ServerAliveInterval en /etc/ssh/ssh_config de la máquina cliente o ClientAliveInterval en /etc/ssh/sshd_config de la máquina servidor. Intente reducir el intervalo si todavía está recibiendo el error.

La configuración para un solo usuario se puede establecer en el archivo ~/.ssh/config tanto en el servidor como en el lado del cliente. Asegúrate de que el archivo tenga los permisos correctos chmod 644 ~/.ssh/config .

    
respondido por el Aram Kocharyan 26.05.2012 - 11:49
70

Las sesiones SSH pueden interrumpirse debido a numerosas y posiblemente inevitables razones.

Una utilidad útil que se puede usar para mitigar problemas causados ​​por esto se llama screen . Screen es una poderosa utilidad que te permite controlar múltiples terminales que permanecerán activas independientemente de la sesión de ssh. Por ejemplo, si ejecuta screen en una sesión ssh, verá un nuevo terminal abierto y puede usarlo para ejecutar trabajos. Digamos que tu sesión ssh muere en el proceso. Al ejecutar screen -d y luego screen -r volverá a abrir la última sesión y podrá continuar desde allí. Asegúrese de leer parte de la documentación antes de usarla.

    
respondido por el eltommo 04.10.2012 - 16:28
40

Configuración del cliente

Intente crear el archivo:

~/.ssh/config

Agregue los contenidos:

Host *
  ServerAliveInterval 30
  ServerAliveCountMax 5

Ahora ssh a su servidor y vea si su problema está solucionado. La opción ClientAliveInterval solo es útil al configurar el servidor ssh (también conocido como sshd), no cambia nada en el lado del cliente ssh, así que no lo use en el archivo de configuración anterior.

Esto enviará una señal de hello-are-you-there al servidor si no se han recibido paquetes en los últimos 30 segundos (como se especifica arriba). Sin embargo, si la cantidad de señales consecutivas de hello-are-you-there llega a ServerAliveCountMax, ssh se desconectará del servidor. Este valor está predeterminado en 3 (por lo tanto, 3 * 30 = 90 segundos sin actividad del servidor), increméntelo si satisface sus necesidades. Hay muchas más opciones de configuración para el archivo .ssh / config y puede leer:

Uso de un archivo de configuración SSH

Para obtener más información sobre otras opciones. Es posible que no desee aplicar esto a todos los servidores que conecte a los que este ejemplo. O restringirlo solo a un servidor en particular reemplazando la línea Host * con Host <IP> (reemplazar por una dirección IP, ver la página man de ssh_config).

Configuración del servidor

De manera similar, puede decirle al servidor que sea amable con sus clientes. El archivo de configuración es /etc/ssh/sshd_config .

ClientAliveInterval 20
ClientAliveCountMax 5

Puedes desactivarlo configurando ClientAliveInterval a 0 o tweak ClientAliveInterval y ClientAliveCountMax para establecer una inactividad máxima del cliente ssh sin responder a las sondas. Una ventaja de esta configuración sobre TCPKeepAlive es que las señales se envían a través de los canales encriptados, por lo que es menos probable que sean falsificables.

    
respondido por el Matt 06.10.2013 - 02:54
22

Estoy actualizando de forma remota un servidor Ubuntu desde lúcido hasta preciso y perdí la conexión ssh en el medio de la actualización con el mensaje "Error de escritura, tubería Brocken". ClientAliveInterval y ServerAliveInterval no hicieron nada. La solución es activar las opciones TCPKeepAlive en el cliente ssh:

TCPKeepAlive yes

en

/etc/ssh/ssh_config
    
respondido por el Alexey Sviridov 07.10.2012 - 18:40
18

Para el cliente, edite su archivo ~/.ssh/config (o /etc/ssh/ssh_config ) de la siguiente manera:

Host *
  TCPKeepAlive yes
  ServerAliveInterval 120
  

TCPKeepAlive : especifica si el sistema debe enviar TCP keepalive   mensajes al otro lado. Si se envían, la muerte de la conexión   o el choque de una de las máquinas se notará correctamente. Sin embargo,   esto significa que las conexiones morirán si la ruta se reduce temporalmente,   y algunas personas lo encuentran molesto (el valor predeterminado es 'sí').

     

ServerAliveInterval - Establece un intervalo de tiempo de espera en segundos después del cual   si no se han recibido datos del servidor, ssh (1) enviará un   mensaje a través del canal encriptado para solicitar una respuesta del   servidor. El valor predeterminado es 0, lo que indica que estos mensajes no serán   enviado al servidor.

Para el servidor, edite su /etc/ssh/sshd_config como:

ClientAliveInterval 600
ClientAliveCountMax 0

Si desea que el cliente ssh salga (tiempo de espera) automáticamente después de 10 minutos (600 segundos).

  

ClientAliveCountMax - Esto indica el número total de verificación   mensaje enviado por el servidor ssh sin obtener ninguna respuesta del   ssh cliente. El valor predeterminado es 3.

     

ClientAliveInterval : indica el tiempo de espera en segundos. Después de x   número de segundos, el servidor ssh enviará un mensaje al cliente preguntando   para la respuesta. Deafult es 0 (el servidor no enviará mensajes al cliente para   verificar.).

Ver también: ¿Qué opina? ServerAliveInterval y ClientAliveInterval en sshd_config do, precisamente?

    
respondido por el kenorb 02.10.2014 - 13:52
15

Adoro a Mosh. Frecuentemente entro en un servidor, cierro mi computadora portátil y voy a un café, lo abro y sigo como si nada hubiera cambiado.

  

Mosh (shell móvil)

     

Aplicación de terminal remoto que permite itinerancia , admite intermitente   conectividad , y proporciona local inteligente   echo y edición de líneas de pulsaciones de teclas del usuario.

     

Mosh es un reemplazo de SSH. Es más robusto y receptivo,   especialmente a través de Wi-Fi, celulares y enlaces de larga distancia.

     

Mosh es software gratuito, disponible para GNU / Linux, FreeBSD, Solaris, Mac OS X y Android.

    
respondido por el Jake 30.09.2014 - 18:48
4

Para mí, obtenía Write failed: Broken pipe incluso cuando estaba escribiendo activamente en vim o en el indicador del shell. Tampoco pude navegar en internet localmente por un tiempo. (Me estaba conectando de forma remota a Ubuntu usando Terminal.)

Otros en mi red transmiten muchos videos de Netflix y otros lugares. No puedo probarlo, pero sospecho que es un problema de ISP o enrutador. Por ejemplo, Verizon y Netflix se señalan mutuamente por los problemas de red de sus clientes.

Si tiene una conexión de acceso telefónico y está transmitiendo video o música con una conexión simultánea SSH o telnet, es inevitable que en algún momento reciba un mensaje de pipa interrumpida. La actualización de mi paquete de banda ancha de ISP pareció hacer que mi conexión interrumpida fuera menos frecuente.

    
respondido por el Parag Magunia 30.07.2014 - 13:33
3

Tengo un script en el servidor remoto que nunca parece fallar, independientemente del cliente o servidor de configuración de SSH.

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

Guárdelo en algún archivo dummy.sh y ejecútelo rápidamente antes de minimizar la ventana o alejarse de ella. Seguirá imprimiendo la marca de tiempo actual en el servidor y mantendrá viva su conexión siempre que la conexión no se pierda por ningún otro motivo. Cuando regrese a esa terminal, simplemente presione CTRL + C y siga trabajando.

    
respondido por el JulioHM 09.09.2013 - 16:50
0

Puedes agregar estos argumentos cada vez que invoques ssh: -o ServerAliveInterval=15 -o ServerAliveCountMax=3

No necesita editar archivos de configuración / etc / ssh / * si hace esto.

Puedes crear un alias o función de bash o script para que sea más fácil.

E.g. estas funciones bash, puede agregarlas a su .bashrc, do_ssh se usa manualmente para activar keepalives. do_ssh_pty se usa dentro de los scripts para configurar pty y evitar avisos.

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 $*
}

Ahora se puede usar do_ssh user@host o do_ssh user@host <args> <command> y keepalives estará activo.

    
respondido por el gaoithe 12.02.2018 - 13:05

Lea otras preguntas en las etiquetas