Tengo unos diez servidores a los que me conecto con SSH de forma regular. Cada uno tiene una entrada en mi computadora local~/.ssh/config archivo de .
Para evitar perder el control de mi proceso de ejecución cuando mi conexión a Internet inevitablemente se cae, siempre trabajo dentro de una tmuxsesión. Me gustaría una forma de que tmux se conecte automáticamente cada vez que se inicia una conexión SSH, por lo que no tengo que escribir siempre tmux attach || tmux newdespués de ingresar por SSH.
Desafortunadamente, esto no está resultando ser tan simple como esperaba originalmente.
- No quiero agregar ningún comando a los
~/.bashrcservidores porque solo lo quiero para sesiones SSH, no sesiones locales. - Agregar
tmux attach || tmux newa los~/.ssh/rcservidores simplemente da como resultado que se arroje el errornot a terminaldespués de la conexión, incluso cuando laRequestTTY forceopción se agrega a la línea para ese servidor en mi archivo de configuración SSH local.

~/.ssh/config: la mayoría de los que vienen aquí probablemente no estén buscando ninguna de las primeras cinco respuestas, sino la sexta ( stackoverflow.com/a/52838493/5354137 ). Con cualquiertmuxversión razonablemente reciente , esa también es la forma más sensata de hacer las cosas.Respuestas:
Configuración del lado del servidor:
Para iniciar automáticamente tmux en su servidor remoto cuando normalmente inicia sesión a través de SSH (y solo SSH), edite el
~/.bashrcde su usuario o raíz (o ambos) en el servidor remoto en consecuencia:Este comando crea una sesión tmux llamada
ssh_tmuxsi no existe ninguna, o se vuelve a conectar a una sesión ya existente con ese nombre. En caso de que su conexión se interrumpa o cuando haya olvidado una sesión hace semanas, cada inicio de sesión SSH lo regresa automáticamente a la sesión tmux-ssh que dejó atrás.Conéctese desde su cliente:
Nada especial, solo
ssh user@hostname.fuente
ssh_tmuxa$USER)$SSH_TTYvs$SSH_CONNECTIONtambién.tmux new-session -A -s ssh_tmuxpara reemplazartmux attach-session -t ssh_tmux || tmux new-session -s ssh_tmuxmucho más corto, si es un poco más confuso,-Ale dice a tmux que adjunte la sesión si ya existeif [[ -n "$PS1" ]] && [[ -z "$TMUX" ]] && [[ -n "$SSH_CONNECTION" ]];$PS1, use[[ $- == *i* ]]en su lugar, ya que PS1 puede definirse incluso cuando no es un shell interactivo.Muy bien, encontré una solución bastante satisfactoria. En mi local
~/.bashrc, escribí una función:que básicamente sobrescribe la función de terminal ssh para llamar al programa ssh incorporado con los argumentos dados, seguido de
"tmux attach || tmux new".(
$@Denota todos los argumentos proporcionados en la línea de comando, porssh -p 123 user@hostnamelo que se expandirá assh -t -p 123 user@hostname "tmux attach || tmux new")(Los
-targumento es equivalenteRequestTTY Forcey necesario para el comando tmux).fuente
tmuxadmite, considere usar latmux new -A fooque se adjuntará a una sesión existente nombradafoosi es posible, creándola si es necesario. Esto le permite simplificar su función/usr/bin/ssh -t "$@" tmux new -A(¡y asegúrese de citar$@!).function sshto algo similar para que pueda continuar usándolosshnormalmente. De lo contrario, simplemente escriba/usr/bin/sshen el símbolo del sistema cada vez que se conecte a una máquina sin tmux :)sshta~/bin.ssh -t user@hostname "LANG=$LANG tmux attach || tmux new"Conectar:
Durante la sesión:
Úselo
Ctrl+dpara finalizar la sesión (la ventana tmux se cierra) oCtrl+b dpara desconectarse temporalmente de la sesión y conectarse nuevamente más tarde.Cuando esté dentro de tmux en cualquier momento, puede usar
Ctrl+b spara ver la lista de sesiones y cambiar la actual a otra.Arregle su .bashrc:
Te recomiendo definir la función universal en tu
.bashrc:Utiliza el
22puerto por defecto. Defina también sus alias de conexión rápida:Iniciar sesión sin contraseña:
Y si no desea escribir la contraseña cada vez que genere
.sshclaves para iniciar sesión automáticamente :Pon tu clave pública en el host remoto:
Consejos adicionales:
Si desea utilizar un ID de sesión temporal que se corresponda con una sesión de bash local, utilice como ID de tmux :
fuente
||en algunos casos de uso es incluirnew-sessionen.tmux.confy sólo tiene que utilizar siempretmux a -t 0.tmux new-session -Aque se adjuntará si existe, de lo contrario creará uno nuevo.Usé líneas de @kingmeffisto (no puedo comentar esa respuesta) y agregué una salida para que la terminación de tmux también termine la conexión ssh. Sin embargo, esto rompió las sesiones SFTP, por lo que tuve que verificar en
$SSH_TTYlugar de$SSH_CONNECTION.EDITAR 4/2018: Prueba agregada para terminal interactivo a través de
[[ $- =~ i ]]para permitir que funcionen herramientas como Ansible.fuente
Como se describe en esta publicación de blog , puede ssh y luego adjuntarlo a una sesión tmux existente con un solo comando:
fuente
tmux attach || tmux newpara que no se cree una nueva sesión tmux para cada conexión). La parte complicada es que el comando correcto esssh -t user@host tmux attach || tmux newy la única forma de alias algo que necesita un argumento dentro de la cadena de comandos es crear una nueva función, como hice anteriormente.ssh [hostname] -t tmux attach -t [sessionName]tmux 3.1 o más reciente¹ en la máquina remota
En su local
~/.ssh/config, ponga²:No relacionado, pero si está tratando con caracteres que no son ASCII, le recomiendo cambiar eso a
tmux -u …para habilitar explícitamente el soporte Unicode incluso en máquinas que no tienen configuradas las variables de entorno adecuadas.tmux 3.0a o anterior en la máquina remota
Casi igual que el anterior, pero cambia la última línea a³:
¹ A partir del 2020-10-29, la lista de distribuciones que se envían con tmux 3.1 o posterior es bastante larga.
²
newes la abreviatura denew-session.³
ates la abreviatura deattach-session.Método alternativo usando el
authorized_keysarchivo del control remoto :Si prefiere no tener un
~/.ssh/configarchivo por cualquier motivo, o si desea que la máquina remota obligue a la máquina que se conecta a conectarse o abrir la sesión, agregue esto a su control remoto~/.ssh/authorized_keys:Esto, por supuesto, funcionará desde todos los clientes que tengan instalada la clave privada correspondiente, lo que podría ser una ventaja o una desventaja, según lo que desee. Existe el riesgo de que, en caso de que algo salga mal, ya no sea posible conectarse.
fuente
tmux atlugar detmux a? También sería prudente usar una sesión con nombre para esto o tmux se adjuntaría a sesiones existentes "aleatorias" al iniciar sesión en el host.Ctrl+ACtrl+Z.Ctrl-BDfunciona tratar en comparación conCtrl-BCtrl-Z. ¡Gracias!byobu es un contenedor muy útil para tmux / screen. Se conecta a una sesión existente si está presente o crea una nueva.
Lo uso con autossh que reconecta con gracia la sesión ssh. Muy recomendable en caso de problemas de conectividad intermitentes.
fuente
Puede que le resulte útil: utiliza ssh en un bucle y se vuelve a conectar o se conecta a una sesión tmux existente para que tenga una forma agradable, fácil y confiable de volver a conectarse después de una interrupción de la red
fuente
Este es el que realmente crea una gran experiencia de usuario. Automáticamente inicia tmux cada vez que abre la terminal (tanto físicamente como ssh). Puede comenzar su trabajo en un dispositivo, salir de la terminal y reanudar en el otro. Si detecta a alguien ya adjunto a la sesión, creará una nueva sesión. Ponlo en el servidor , dependiendo de tu shell
~/.zshrco~/.bashrc.if [[ -z "$TMUX" ]] ;then ID="$( tmux ls | grep -vm1 attached | cut -d: -f1 )" # get the id of a deattached session if [[ -z "$ID" ]] ;then # if not available attach to a new one tmux new-session else tmux attach-session -t "$ID" # if available attach to it fi fifuente
Sé que estoy reviviendo un hilo antiguo, pero he trabajado un poco en la solución bashrc y creo que tiene algún uso:
Hay un límite de 10 (11) sesiones por ahora; no quería matar mi servidor con un bucle infinito en bashrc. Parece funcionar de manera bastante confiable, aparte del error de tmux fallando en la lista de clientes si la sesión no existe.
fuente
Esta forma le permite volver a conectarse a una instancia tmux antigua si su sesión ssh cae. El
execguarda un tenedor, por supuesto.fuente