Cómo actualizar automáticamente las variables de entorno del agente SSH cuando se adjunta a las sesiones tmux existentes
ssh-agent (6)
Estoy tratando de encontrar una buena manera de restaurar el agente SSH cuando reconecto una sesión tmux desconectada.
La causa parece ser que la sesión del agente SSH cambia, pero la variable de entorno de la sesión tmux no se actualiza.
¿Cómo puedo automatizar esto, antes de adjuntar la sesión? Debido a que la sesión a la que estoy adjuntando no siempre tiene un indicador bash, no puedo permitirme escribir algo dentro de ella. Tiene que ser algo para ejecutar antes de crear o adjuntar la sesión tmux.
Un ejemplo del código que estoy ejecutando es https://gist.github.com/ssbarnea/8646491 - un pequeño contenedor ssh que usa tmux para crear conexiones ssh persistentes. Esto funciona bastante bien, pero a veces el agente ssh deja de funcionar, por lo que ya no puedo usarlo para conectarme a otros hosts.
Aquí está mi solución que incluye ambos enfoques y no requiere escritura adicional cuando me reconecto a la sesión tmux
alias ssh=''[ -n "$TMUX" ] && eval $(tmux showenv -s SSH_AUTH_SOCK); /usr/bin/ssh''
Esto es lo que uso para actualizar SSH_AUTH_SOCK
dentro de una ventana de tmux
(basado en el script de Hans Ginzel):
alias fixssh=''eval $(tmux showenv -s SSH_AUTH_SOCK)''
O para tmux
que no tiene showenv -s
:
alias fixssh=''export $(tmux showenv SSH_AUTH_SOCK)''
Hay muchas buenas respuestas aquí. Pero hay casos en los que tmux show-environment
no ve SSH_AUTH_SOCK
. En ese caso puedes usar find
para localizarlo explícitamente.
export SSH_AUTH_SOCK=$(find /tmp -path ''*/ssh-*'' -name ''agent*'' -uid $(id -u) 2>/dev/null | tail -n1)
Eso es largo y complicado, así que lo desglosaré ...
01 export SSH_AUTH_SOCK=$(
02 find /tmp /
03 -path ''*/ssh-*''
04 -name ''agent*''
05 -uid $(id -u)
06 2>/dev/null
07 | tail -n1
08 )
-
export
el conjunto de variables de entornoSSH_AUTH_SOCK
a la salida de la sustitución del comando$()
-
find
archivos que comienzan en/tmp
- limitar los resultados solo a aquellos con
/ssh-
en la ruta - limitar los resultados solo a aquellos cuyo nombre comience con el
agent
- limitar los resultados solo a aquellos con una identificación de usuario que coincida con el usuario actual
- silenciar todos los errores (permisos, etc.)
- tomar solo el último resultado si hay múltiples
Puede dejar de 6 y 7 si sabe que solo habrá 1 resultado y no le importa la basura stderr.
Hay una idea excelente de Martijn Vermaat, que aborda su problema con gran profundidad, aunque está pensado para usuarios de pantallas, así que aquí lo estoy ajustando para tmux.
Para resumir:
cree
~/.ssh/rc
si aún no existe, y agregue el siguiente contenido:#!/bin/bash # Fix SSH auth socket location so agent forwarding works with tmux if test "$SSH_AUTH_SOCK" ; then ln -sf $SSH_AUTH_SOCK ~/.ssh/ssh_auth_sock fi
Haz que funcione en tmux, agrega esto a tu
~/.tmux.conf
:# fix ssh agent when tmux is detached setenv -g SSH_AUTH_SOCK $HOME/.ssh/ssh_auth_sock
Se requiere trabajo adicional si desea habilitar el reenvío X11, consulte el gist .
Si bien tmux
updates variables SSH
de forma predeterminada, no es necesario
- cambiar / agregar ruta de socket
- cambiar la variable
SSH_AUTH_SOCKET
Me gusta la solución de Chris Down que cambié para agregar función.
fixssh() {
eval $(tmux show-env /
|sed -n ''s/^/(SSH_[^=]*/)=/(.*/)/export /1="/2"/p'')
}
en ~/.bashrc
. Llame a fixssh
después de adjuntar la sesión o antes de ssh
/ scp
/ rsync
.
Versiones más recientes de tmux
support -s
opción para show-env
, tan solo
eval $(tmux show-env -s |grep ''^SSH_'')
es posible.
Utilizo una variación de las respuestas anteriores:
eval "export $(tmux show-environment -g SSH_AUTH_SOCK)"
asumiendo que hiciste que el agente ssh comenzó desde el entorno externo. Lo mismo ocurre con otras variables de entorno como DISPLAY
.