Principalmente trabajo en un mac y ssh / tmux se conecta a una máquina Linux para hacer mi trabajo. Tengo ssh-agent ejecutándose en la máquina Linux. yo tengo
set -g update-environment "SSH_AUTH_SOCK SSH_ASKPASS WINDOWID SSH_CONNECTION XAUTHORITY"
en mi .tmux.conf
. Sin embargo, cada vez que me vuelvo a conectar a esta sesión, tengo que ejecutar
tmux setenv SSH_AUTH_SOCK $SSH_AUTH_SOCK
para que las nuevas ventanas tmux se hayan $SSH_AUTH_SOCK
configurado correctamente. Preferiría no tener que hacer esto. ¿Algunas ideas?
Actualizar
Creo que no estoy explicando esto bien. Aquí está mi función de shell para abrir un shell en una máquina remota:
sshh () {
tmux -u neww -n ${host} "ssh -Xt ${host} $*"
}
Cuando tmux ejecuta este comando ssh, no$SSH_AUTH_SOCK
está configurado, aunque esté configurado en mi entorno local. Si pongo esto en el entorno de tmux con el comando anterior, todo funciona bien. Mi pregunta es, ¿por qué tengo que ejecutar el comando setenv?setenv
Actualización 2
Más información:
Cuando me adjunto a una sesión existente, $SSH_AUTH_SOCK
no se establece en el entorno tmux (o entorno global).
% tmux showenv | grep -i auth_sock
-SSH_AUTH_SOCK
Si lo configuro manualmente, las cosas funcionan:
% tmux setenv SSH_AUTH_SOCK $SSH_AUTH_SOCK
Si lo separo y lo $SSH_AUTH_SOCK
vuelvo a conectar, vuelve a no estar configurado.
fuente
env
?Respuestas:
Desde que recibí el Bounty, volveré a publicar mi comentario clave por razones de integridad y para evitar que los visitantes con el mismo problema se equivoquen:
Tmux eliminará las variables de entorno
La página de manual de Tmux dice que update-environment eliminará las variables "que no existen en el entorno de origen [...] como si se diera -r al comando set-environment".
Aparentemente eso fue lo que causó el problema. Vea la respuesta de Chris a continuación . Sin embargo, todavía no puedo imaginar cómo la variable podría estar ausente en el "entorno de origen" y, sin embargo, ser válida en la ventana tmux recién creada ...
Respuesta previa:
Cómo funciona el reenvío SSH
En la máquina remota, eche un vistazo al entorno de su shell después de establecer la conexión SSH:
El importante aquí es SSH_AUTH_SOCK, que actualmente está configurado en algún archivo en / tmp. Si examina este archivo, verá que es un socket de dominio Unix, y está conectado a la instancia particular de ssh en la que se conectó. Es importante destacar que esto cambia cada vez que se conecta.
Tan pronto como cierre la sesión, ese archivo de socket en particular desaparecerá. Ahora, si va y vuelve a conectar su sesión tmux, verá el problema. Tiene el entorno de cuando tmux se lanzó originalmente, que podría haber sido hace semanas. Ese zócalo en particular hace mucho que está muerto.
Solución
Dado que sabemos que el problema tiene que ver con saber dónde está el socket de autenticación SSH actualmente en vivo, ¡colóquelo en un lugar predecible!
En su archivo .bashrc o .zshrc en la máquina remota, agregue lo siguiente:
No creo que tenga que poner un 'comando de actualización de entorno' en su tmux.conf. Según la página del manual, SSH_AUTH_SOCK ya está cubierto de forma predeterminada.
Crédito
Mi respuesta es un extracto de esta publicación de blog de Mark 'xb95' Smith que explica el mismo problema para la pantalla .
fuente
$SSH_AUTH_SOCK
en nuevos shells, se trata de configurar$SSH_AUTH_SOCK
en nuevas ventanas tmux antes de que se obtenga .bashrc / .zshrc.tmux neww ssh somehost
).SSH_AUTH_SOCK
. Este enfoque solo funciona mientras la sesión tmux está abierta a través de la conexión SSH más reciente.Me di cuenta de esto. Respuesta corta, necesitaba eliminar
SSH_AUTH_SOCK
deupdate-environment
. Como estaba en esa lista, el valor se desvaneció cada vez que lo volví a conectar. Gracias a @djf por la pista. Lo más destacado de la página del comando man tmux (1) en laupdate-environment
sección:fuente
.tmux.conf
para que esto funcione:set -g update-environment "SSH_ASKPASS WINDOWID SSH_CONNECTION XAUTHORITY"
¿Está viendo problemasssh
o variables de entorno en general?En lugar de usar tmux para manejar mi agente ssh, tengo bash para manejarlo con:
Tengo esto en mi ~ / bashrc , y funciona muy bien.
fuente
$SSH_AUTH_SOCK
está configurado correctamente en mis shells, pero cuando hago algo como estotmux neww ssh somehost
, se me pedirá mi frase de contraseña para desbloquear mi clave privada a menos que ejecutetmux setenv SSH_AUTH_SOCK $SSH_AUTH_SOCK
.Respondí una pregunta similar en StackOverflow https://stackoverflow.com/a/49395839/241025 . Como esta página apareció primero en mis búsquedas en Google, quería publicar una versión resumida aquí.
Para que cada sesión de tmux tenga un conjunto de variables de entorno personalizadas, debe agregar los valores a las variables de entorno por sesión de tmux. Aquí hay un ejemplo de cómo hacerlo.
El último paso para exportar explícitamente FOO es necesario para que el panel actual recoja la variable de entorno. Los paneles o ventanas posteriores que cree para esta sesión de tmux heredarán FOO, pero no se mostrarán en otras sesiones.
fuente
La explicación de djf trae otra posible solución a mi mente:
Antes
tmux
/ sescreen
está ejecutando:ssh-agent
.tmux
/screen
con las variables de entorno para estossh-agent
.Esto no pudo usar el reenvío de SSH al cliente, pero eso no fue solicitado.
fuente
ssh-agent
no se une a TTY, ¿por qué debería eliminarse al cerrar sesión (?), ¿por qué usarlonohup
?