¿Cómo evitar "Falló la escritura: tubería rota" en la conexión SSH?

283

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

sorin
fuente
8
Nada en realidad. La sesión se interrumpió y la seguridad de la sesión se vio comprometida. Si no pone la compilación en modo inactivo, puede establecer un tiempo de mantenimiento para que el cliente dispare un latido de mantenimiento al servidor, pero si el sistema va a dormir, no hay nada que se pueda hacer.
darkdragn
3
En este caso, estoy buscando algo que me permita reiniciar una conexión ssh interrumpida (probablemente basada en el código de salida) y restaurar usando screen?
sorin
44
Ustedes están equivocados: tengo DOS máquinas cliente de escritorio conectadas al mismo servidor. Uno es ubuntu 12.10, Quantal, cuyo cliente SSH funciona bien y mantiene la conexión durante horas. El otro es Ubuntu 14.10, Utopic, solo al lado del otro y en una instalación nueva; después de un par de minutos, se bloquea con este mensaje. El resto de las funciones de red en la máquina no se interrumpen. Entonces, no, no es un problema de red ni de servidor, sino un problema específico de software SSH CLIENT, que PUEDE resolverse, al contrario de lo que "darkdragan" se atreve a decir, que "no se puede hacer nada".
David L
2
Y de hecho, como dije: la gente habla demasiado cuando dice "no se puede hacer nada", tal como se atrevió @darkdragn. Leí la respuesta de Aram Kocharyan, y la apliqué: hace 20 minutos ... Me di cuenta de que en mi antiguo Quantal Ubuntu 12.10, había aplicado esa instrucción en ese archivo [lo acabo de comprobar], hace dos años, y eso fue La razón de la estabilidad allí. Lo hice aquí, y en estos últimos 20 minutos, la conexión se ha mantenido estable desde entonces. Entonces, por favor, gente: absténganse cuando se atrevan a pensar que "no se puede hacer nada", y absténganse aún más cuando intenten dejar ese mensaje a otras personas.
David L
11
@DavidL debería leer las preguntas mejor antes de despotricar. Su problema no es el mismo que el del OP, que menciona claramente poner la computadora en suspensión. Que por cierto solo una de las respuestas aborda ("mosh"), y se publicó 2 años después de la pregunta. Sin embargo, las otras respuestas hacen lo siguiente mejor, que es proponer soluciones a casos que pueden resolverse más fácilmente, como la suya. Relájate, no te estreses tanto, despotricar no hace ningún bien por aquí ...
msb

Respuestas:

266

He intentado esto /etc/ssh/ssh_configpara Linux y Mac:

Host *
ServerAliveInterval 120

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

Puede configurar ServerAliveIntervalen /etc/ssh/ssh_configla máquina del cliente o ClientAliveIntervalen /etc/ssh/sshd_configla máquina del servidor. Intente reducir el intervalo si aún recibe el error.

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

Aram Kocharyan
fuente
44
No estoy en una Mac, pero Ubuntu 12.04 y el archivo para este sistema operativo también parece ser ~ / .ssh / config.
H2ONaCl
55
OS X 10.8.4 da un errorBad configuration option: ClientAliveInterval
ohho
3
Me sale el mismo Bad configuration optionerror en OSX 10.8.4.
Nick Heiner
10
Generalmente, coloca estos dos comandos en diferentes partes del sistema. Solo ServerAliveInterval en el lado del cliente OSX ... y solo ClientAliveInterval en el archivo de configuración sshd ...
ftrotter
2
Mi mono me dijo: "¿Por qué no te escribes a ti mismo" arriba [ENTRAR] "
augusto
85

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

Se llama una utilidad útil que se puede utilizar para mitigar los problemas causados ​​por esto screen. Screen es una poderosa utilidad que le permite controlar múltiples terminales que permanecerán con vida independientemente de la sesión ssh. Por ejemplo, si ejecuta screenuna sesión ssh, verá una nueva terminal abierta y puede usarla para ejecutar trabajos. Digamos que su sesión ssh muere en el proceso. Ejecutar screen -dluego screen -rvolverá a abrir la última sesión y podrá continuar desde allí. Asegúrese de leer parte de la documentación antes de usarla.

eltommo
fuente
55
Esta es probablemente la mejor respuesta, no estoy seguro de por qué no se votó más alto. Las otras "soluciones" son útiles en el caso especial en el que realmente le interesaría mantener una conexión SSH, pero en la mayoría de los casos de uso, me imagino que la verdadera preocupación es que los procesos previstos continúen ejecutándose, independientemente de cualquier problema de conexión cliente / servidor. .
Paul McMurdie
16
También agregaría Tmux como alternativa a la pantalla. Lo encuentro más versátil y estable que la pantalla.
viernesmeetssunday
2
solo dejando esto aquí para referencia futura: puede ejecutar convenientemente screen -d -rpara recuperar su última sesión.
doplumi el
2
O simplemente screen -dr. O screen -xdependiendo de lo que estés planeando hacer. El punto es que uno debe saber qué hacen todos esos interruptores, para poder usar los apropiados y no solo seguir ciegamente las sugerencias de la gente de Internet. Hay un buen resumen compacto disponible aquí: ss64.com/bash/screen.html
flith
Esta no es una respuesta al problema
user3728501
46

Configuración del cliente

Intenta crear el archivo:

~/.ssh/config

Agrega 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 saludo al servidor si no se han recibido paquetes en los 30 segundos anteriores (como se especificó anteriormente). Sin embargo, si el número de señales consecutivas de hola-eres-tú llega a ServerAliveCountMax, ssh se desconectará del servidor. El valor predeterminado es 3 (por lo tanto, 3 * 30 = 90 segundos sin actividad del servidor), aumente si se ajusta a sus necesidades. Hay muchas más opciones de configuración para el archivo .ssh / config y puedes leer:

Usar un archivo de configuración SSH

Para más información sobre otras opciones. Es posible que no desee aplicar esto a cada servidor al que se conecte, lo que hará este ejemplo. O restrinja solo a un servidor en particular reemplazando la línea Host *con Host <IP>(reemplace por una dirección IP, consulte la página de manual de ssh_config).

Configuración del servidor

Del mismo modo, puede decirle al servidor que sea amable con sus clientes. El archivo de configuración es /etc/ssh/sshd_config.

ClientAliveInterval 20
ClientAliveCountMax 5

Usted puede desactivarlo mediante el establecimiento ClientAliveIntervalde 0o ajustar ClientAliveIntervaly ClientAliveCountMaxfijar un máximo de inactividad 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 cifrados, por lo que es menos probable que se pueda suplantar.

Mate
fuente
No funciona Estoy enfrentando el mismo error nuevamente.
user997704
3
Pruébelo directamente desde la línea de comando y baje: ssh -o ServerAliveInterval = 5 user @ host
Matt
Intenté eso también ... no funciona. Realmente no sé qué está pasando con mi sistema
user997704
2
Es ClientAliveCountMax, NO ClientAliveMaxCount
David G
@DavidG Edite la respuesta con sus correcciones.
CivMeierFan
23

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

TCPKeepAlive yes

en

/etc/ssh/ssh_config
Alexey Sviridov
fuente
20

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

Host *
  TCPKeepAlive yes
  ServerAliveInterval 120

TCPKeepAlive : especifica si el sistema debe enviar mensajes de keepalive TCP al otro lado. Si se envían, se notará la muerte de la conexión o el bloqueo de una de las máquinas. Sin embargo, esto significa que las conexiones morirán si la ruta se corta 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 cifrado para solicitar una respuesta del servidor. El valor predeterminado es 0, lo que indica que estos mensajes no se enviarán al servidor.


Para el servidor, edite su /etc/ssh/sshd_configcomo:

ClientAliveInterval 600
ClientAliveCountMax 0

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

ClientAliveCountMax : indica el número total de mensajes checkalive enviados por el servidor ssh sin obtener ninguna respuesta del cliente ssh. 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 pidiéndole respuesta. El valor predeterminado es 0 (el servidor no enviará un mensaje al cliente para verificarlo).


Ver también: ¿Qué hacen las opciones ServerAliveIntervaly ClientAliveIntervalen sshd_config, precisamente?

kenorb
fuente
Establecer un ServerAliveCountMax más alto que el predeterminado en el cliente también debería ayudar a mantener la conexión activa para conexiones lentas.
jonnyjandles
17

Absolutamente amo a Mosh. Con frecuencia ingreso a un servidor, cierro mi computadora portátil y voy a un café, lo abro y continúo como si nada hubiera cambiado.

Mosh (carcasa móvil)

Aplicación de terminal remota que permite la itinerancia , admite conectividad intermitente y proporciona eco local inteligente y edición de línea de las pulsaciones de teclas del usuario.

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

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

Jake
fuente
6

Para mí, estaba obteniendo Write failed: Broken pipeincluso cuando estaba escribiendo activamente en vim o en el indicador de comandos de shell. Tampoco pude navegar por Internet localmente por un tiempo. (Me estaba conectando remotamente 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 entre sí 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 SSH o telnet simultánea, es inevitable que en algún momento reciba un mensaje de canal roto. La actualización del paquete de banda ancha de mi ISP hizo que mi conexión interrumpida fuera menos frecuente.

Parag
fuente
3

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

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

Guárdelo en un 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á su conexión activa siempre que la conexión no se corte por ningún otro motivo. Cuando regrese a esa terminal, simplemente presione CTRL + C y siga trabajando.

JulioHM
fuente
99
o simplemente salir topcorriendo
Eben Geer
1

Puede agregar estos argumentos cada vez que invoque ssh: -o ServerAliveInterval=15 -o ServerAliveCountMax=3

No tiene que editar los archivos de configuración / etc / ssh / * si hace esto.

Puede crear un alias bash o una función o script para facilitar esto.

Por ejemplo, estas funciones de 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 do_ssh user@hostse puede usar o do_ssh user@host <args> <command>y keepalives estará activo.

gaoithe
fuente