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 tmux
sesió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 new
después de ingresar por SSH.
Desafortunadamente, esto no está resultando ser tan simple como esperaba originalmente.
- No quiero agregar ningún comando a los
~/.bashrc
servidores porque solo lo quiero para sesiones SSH, no sesiones locales. - Agregar
tmux attach || tmux new
a los~/.ssh/rc
servidores simplemente da como resultado que se arroje el errornot a terminal
después de la conexión, incluso cuando laRequestTTY force
opció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 cualquiertmux
versió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
~/.bashrc
de su usuario o raíz (o ambos) en el servidor remoto en consecuencia:Este comando crea una sesión tmux llamada
ssh_tmux
si 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_tmux
a$USER
)$SSH_TTY
vs$SSH_CONNECTION
también.tmux new-session -A -s ssh_tmux
para reemplazartmux attach-session -t ssh_tmux || tmux new-session -s ssh_tmux
mucho más corto, si es un poco más confuso,-A
le 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@hostname
lo que se expandirá assh -t -p 123 user@hostname "tmux attach || tmux new"
)(Los
-t
argumento es equivalenteRequestTTY Force
y necesario para el comando tmux).fuente
tmux
admite, considere usar latmux new -A foo
que se adjuntará a una sesión existente nombradafoo
si 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 ssht
o algo similar para que pueda continuar usándolossh
normalmente. De lo contrario, simplemente escriba/usr/bin/ssh
en el símbolo del sistema cada vez que se conecte a una máquina sin tmux :)ssht
a~/bin
.ssh -t user@hostname "LANG=$LANG tmux attach || tmux new"
Conectar:
Durante la sesión:
Úselo
Ctrl+d
para finalizar la sesión (la ventana tmux se cierra) oCtrl+b d
para desconectarse temporalmente de la sesión y conectarse nuevamente más tarde.Cuando esté dentro de tmux en cualquier momento, puede usar
Ctrl+b s
para 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
22
puerto 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
.ssh
claves 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-session
en.tmux.conf
y sólo tiene que utilizar siempretmux a -t 0
.tmux new-session -A
que 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_TTY
lugar 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 new
para 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 new
y 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.
²
new
es la abreviatura denew-session
.³
at
es la abreviatura deattach-session
.Método alternativo usando el
authorized_keys
archivo del control remoto :Si prefiere no tener un
~/.ssh/config
archivo 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 at
lugar 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+A
Ctrl+Z
.Ctrl-B
D
funciona tratar en comparación conCtrl-B
Ctrl-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
~/.zshrc
o~/.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 fi
fuente
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
exec
guarda un tenedor, por supuesto.fuente