tmux ssh-agent

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 )

  1. export el conjunto de variables de entorno SSH_AUTH_SOCK a la salida de la sustitución del comando $()
  2. find archivos que comienzan en /tmp
  3. limitar los resultados solo a aquellos con /ssh- en la ruta
  4. limitar los resultados solo a aquellos cuyo nombre comience con el agent
  5. limitar los resultados solo a aquellos con una identificación de usuario que coincida con el usuario actual
  6. silenciar todos los errores (permisos, etc.)
  7. 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:

  1. 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

  2. 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 .