A menudo tengo que conectarme a un servidor a través de ssh en un entorno wifi poco confiable. En el servidor, ejecuto la pantalla, por lo que si me desconecto, puedo volver a conectarme y reanudar la sesión de la pantalla, y retomar donde lo dejé, pero la pérdida de conexión sigue siendo un sumidero de tiempo importante: si la conexión se cae mientras yo Estoy en el servidor, la ventana de terminal tiende a congelarse. Tengo que eliminar esa pestaña, abrir una nueva, ssh al servidor nuevamente y reanudar la sesión de pantalla. He intentado esto con la pantalla en ejecución en el servidor y la pantalla localmente. De cualquier manera, tiende a congelarse cuando se corta la conexión.
¿Hay alguna manera de que pueda tener algo similar a la pantalla, o tal vez la pantalla en sí misma, que intentará reconectarse automáticamente y mantener la sesión en ejecución, para que no tenga que volver a conectarme manualmente? A menudo, cuando pierdo la conexión, creo que es solo por un período muy breve, quizás menos de un segundo.
Estoy usando Ubuntu 14.04 LTS, edición MATE. Gracias
fuente
<Enter>
y escriba~.
para decirle a su lado que desconecte la conexión, y simplemente puede repetir el último comando ssh para volver a conectar (por ejemplo, con la flecha hacia arriba o!!
).Respuestas:
Puedes mirar usando
mosh
: https://mosh.org/Puede configurar un servidor 'jump' con una conexión a Internet confiable a la que se
mosh
conecte y luego tenerssh
sesiones en cada servidor que administre. La razón por la que sugiero usar un servidor de salto es que quizás no desee instalarmosh
en los servidores que está administrando.Otra ventaja
mosh
es que se basa en UDP en lugar de TCP, y su sesión puede sobrevivir a un cambio de dirección IP, por ejemplo, pasar de WiFi a una conexión de internet móvil.Solo para dejarlo claro,
mosh
no es un reemplazoscreen
, sino más bienssh
. Todavía es una buena idea usarloscreen
, ya que enmosh
sí mismo no proporciona una manera de volver a conectarse a su sesión si el cliente muere por alguna razón.fuente
Lo he estado usando
tmux
durante algunos años y, según mi experiencia, se vuelve a conectar automáticamente. Al menos cuando la conexión falla solo por un tiempo relativamente breve. Tenga en cuenta que en realidad lo usobyobu
con tmux como back-end. No sé si esto robustez es una característica detmux
obyobu
, o incluso de la combinación de los dos, pero sugiero que le permite obtener una oportunidad.Me conecto desde mi instalación local de Arch a varios servidores remotos de Ubuntu a través de una VPN. Lo probé ahora mismo desenchufando mi cable de red mientras estaba conectado al control remoto. La sesión se suspendió, pero tan pronto como mi cable se volvió a enchufar, se reanudó sin problemas.
Sin embargo, cuando probé reiniciando mi enrutador, la conexión no regresó. Supongo que tiene algo que ver con el tiempo que la red estuvo inactiva, pero parece volver a conectarse si solo está inactiva unos segundos.
En caso de que sea relevante, hago todo esto usando
terminator
mi emulador de terminal.Los tres están disponibles en los repositorios de Ubuntu:
Sin embargo, no estoy del todo seguro de que tampoco
tmux
obyobu
sea mejor en el manejo de desconexiones ssh. Solo sé que, en mi experiencia, a menudo regresan de pérdidas de conexión cortas. Sin embargo, eso puede deberse a otros aspectos de mi configuración.fuente
tcp
conexión. Según mi experiencia,ssh
puede ser muy resistente a los abandonos de red intermitentes, no creo que esto tenga nada que ver con el hecho de que está usandotmux
dentro de lassh
ventana.ClientAlive
/ServerAlive
disparadores, o ... No tengo idea de lo quebyobu
hace, sin embargo .tmux
es básicamente una alternativa más moderna ascreen
, sí. Cuando comencé a trabajar como lo hago ahora y necesitaba este tipo de cosas, mi lectura superficial sugirió que esatmux
es la mejor opción en estos días. Tampoco estoy 100% seguro de que tenga una mejor gestión de las conexiones perdidas, todo lo que sé es que se recupera de breves interrupciones en mi experiencia. Si eso se debe atmux
algo más, no lo sé. Pero parece que vale la pena intentarlo :). Byobu es básicamente una interfaz para screen / tmux, no un emulador de terminal GUI. Sin embargo, es extremadamente útil: byobu.orgUse las
ServerAlive
opciones de ssh para detectar cuándo ha fallado la conexión.Entonces, si configura
ServerAliveInterval
a 5,ssh
se desconectará automáticamente si la red falla durante 15 segundos.fuente
~.
(o primero Enter, luego~.
) que consiste en: el personaje de escape~
y el comando para romper la sesión.
En condiciones similares, tiendo a usar
eshell
TRAMP (sobre ssh) dentro de Emacs. TRAMP se encarga de volver a conectar cuando sea necesario sin causarme muchos problemas al dar los comandos deseados para el shell remoto.Sin embargo, eshell no es bueno como terminal, es decir, para ejecutar comandos que hacen algo especial con el terminal, o que se ejecutan durante un período significativo de tiempo de forma continua (incremental) imprimiendo algo.
Básicamente, es bastante simple comenzar a usarlo en Emacs con TRAMP:
fuente
Descargo de responsabilidad
Si su conexión SSH no está sobreviviendo a breves interrupciones de la red, entonces está sucediendo algo más que no permite que
ssh
TCP haga lo normal.Ver abajo para más detalles. De todas formas:
La solución sin dependencias más rápida y sucia
Cree un script de shell como este:
Esto solo ejecutará un bucle estúpido simple que sigue intentando conectarse
ssh
y conectarsescreen
. Pase el host o cualquier otra cosa que normalmente pasaría a sussh
invocación como argumentos de línea de comandos.La reconexión solo se basa en si SSH informa un error con la conexión, lo que significa que no tiene inteligencia para detectar errores que no sean SSH como "literalmente no tiene WiFI activado" o lo que sea, pero eso probablemente no importa tú.
Supongo que tiene
ssh-agent
o una clave SSH sin frase de contraseña que permitirá que las reconexiones simplemente funcionen sin una entrada adicional de su parte.Habrá una pequeña condición de carrera en la que si golpeas
^C
durante la fracción de segundo imperceptible para los humanos durante una reconexión, podrías terminar matando el script en lugar de pasarlo^C
al terminal del cliente, por lo que si sospechas que una conexión se bloquea no triture^C
demasiado celosamente.La solución de software adicional más simple
Puede probar el programa autossh , que debería estar disponible en su repositorio de paquetes de Ubuntu.
Si necesita compilar desde la fuente o auditarlo, es un solo programa en C que se compila sin ninguna biblioteca adicional como dependencias, parece tener más inteligencia sobre la comprobación de la vida de la conexión que mi truco anterior, y también se envía con un
rscreen
comando de script conveniente que auto -se adjunta ascreen
.Detalles
Como
ssh
normalmente se recuperaSolo para verificar, porque no me gusta decir cosas sin verificarme, realicé una pequeña prueba antes de responder:
Me conecté a mi WiFi con un dispositivo Linux, hice una conexión SSH a otro dispositivo en mi LAN, verifiqué que tenía una
ssh
conexión que funcionaba con el otro extremo (podía ejecutar comandos, etc.), luego en el cliente desconecté el WiFi (causando la interfaz para ser desconfigurado: no más direcciones IP), ingresó un montón más de caracteres en la sesión ssh (sin respuesta, por supuesto) y luego se volvió a conectar a mi WiFi; la reconexión realmente falló al menos una vez debido a una mala señal y otros factores , luego finalmente me reconecté: esperé unos cinco segundos para que lassh
sesión se recuperara, no pasó nada, así que presioné una tecla más, y lassh
sesión inmediatamente volvió a la vida, con todas las teclas que había escrito durante la desconexión que aparecían en la línea de comando.Vea,
ssh
solo escribe / lee en el socket de la red TCP hasta que el sistema operativo le dice que algo salió mal, y TCP en realidad es muy tolerante con las caídas prolongadas de la conexión.Si se deja en sus propios dispositivos con la configuración predeterminada del kernel, la pila TCP en Linux tolerará felizmente que la conexión se quede completamente en silencio durante muchos minutos antes de declarar que la conexión está inactiva e informar un error: para
ssh
cuando finalmente se dé por vencido, estamos hablando en el estadio. de ~ 30 minutos, o al menos lo suficientemente seguro como para durar un segundo o un minuto.Debajo de las cubiertas, la pila TCP de Linux reintenta gradualmente los mensajes con retrasos cada vez más largos, lo que significa que para cuando vuelva su conexión, es posible que esté viendo un retraso adicional antes de que su
ssh
sesión parezca "cobrar vida" nuevamente.¿Por qué esto a veces se rompe?
A menudo, algo hace que la conexión se cierre activamente después de un período de inactividad significativamente más corto que la cantidad que tolerará la pila TCP, y luego no informa ese estado de conexión a su
ssh
cliente.Los candidatos probables incluyen:
Los cortafuegos o enrutadores NAT, que tienen que usar memoria para recordar cada conexión TCP en vivo, como una optimización y alguna mitigación contra los ataques de DOS, a veces simplemente olvidan su conexión y luego ignoran silenciosamente los paquetes consiguientes, porque los paquetes en el En medio de una conexión cuando no recuerdas que la conexión existente parece no válida.
Los cortafuegos / enrutadores con mejor comportamiento inyectarán un paquete TCP RST, que generalmente se manifiesta como un
connection reset by peer
mensaje de error, pero el paquete de reinicio se dispara y olvida, por lo que si la conexión a su cliente todavía tiene problemas en ese momento y deja caer el restablecer el paquete también, su cliente pensará que la conexión sigue viva.El servidor en sí podría tener una política de firewall para eliminar silenciosamente paquetes inesperados, lo que interrumpiría los intentos de reanudación de la conexión del cliente cada vez que el servidor piense que la conexión se cerró pero el cliente no: su cliente sigue intentando continuar la conexión, pero el servidor simplemente ignorándolo porque no hay conexión en vivo a la que pertenecen estos paquetes en el estado del servidor de seguridad del servidor.
Como está ejecutando Linux, revise cuidadosamente el servidor
iptables
/ip6tables
(onft
si está usando las cosas nuevas) para saber exactamente lo que está permitiendo en lugar de dejarlo caer. Es muy común permitir paquetes nuevos / establecidos / relacionados en el puerto TCP SSH, pero no los "inválidos": si descarta silenciosamente todo lo que no está permitido, esta configuración común podría causar este tipo de bloqueos después de breves problemas de conexión .Su propio servidor SSH podría estar configurado para cerrar la conexión después de un período de inactividad, utilizando una de las opciones de OpenSSH para paquetes de keepalive del cliente TCP o SSH. Por sí solo, esto no causará bloqueos indefinidos, pero puede ubicarlo en uno de los estados descritos anteriormente.
Es posible que simplemente no le esté dando suficiente tiempo para "destrabarse" por sí solo después de llegar al estado en el que
ssh
cuelga su sesión.fuente