¿Cómo puedo reenviar una clave ssh ya reenviada a tmux?


15

Me conecto a través de SSH desde una máquina donde se almacenan mis claves, reenvío a una segunda máquina, y luego trato de usar las claves desde tmux. Parece que "pierdo" el reenvío al entrar en tmux. ¿Cómo puedo "reenviar de nuevo" para que pueda usar mis claves desde tmux?

$ ssh [server] -o ForwardAgent=yes
$ git pull       # Succeeds.
$ /bin/bash
$ git pull       # Still succeeds, despite new shell.
$ exit
$ tmux attach
$ git pull       # Permission denied (publickey)

Confirmo que si inicia un agente compartido entre todas sus sesiones, funciona. La documentación en bose.utmb.edu/Compu_Center/ssh/SSH_HOWTO.html > Configurar el proceso ssh-agent explica un método para lograr este resultado.
Dereckson

Respuestas:


12

Si está adjuntando una sesión tmux ya existente, el shell no hereda las variables de entorno de su shell de inicio de sesión. En particular, no heredará las variables de entorno del agente ssh.

Prueba esta solución :

  1. Cree este script y póngalo en $ HOME / .ssh / saveagent

    #!/bin/sh
    SSHVARS="SSH_CLIENT SSH_TTY SSH_AUTH_SOCK SSH_CONNECTION DISPLAY"
    
    for var in ${SSHVARS} ; do
      echo "export $var=\"$(eval echo '$'$var)\""
    done 1>$HOME/.ssh/latestagent
  2. Agréguelo a su script de inicio de shell. Por ejemplo, si usas bash:

    echo '. ~/.ssh/saveagent' >> ~/.bash_login
  3. Después de conectar el tmux, ejecute . $HOME/.ssh/latestagent

Consulte también ¿Cómo puedo ejecutar un script inmediatamente después de conectarme a través de SSH? y adjuntar a la sesión tmux y ejecutar un comando


1
Envíe a .profile quizás, si está tratando de ser compatible con otros shells.
Dereckson

2
¡Gran respuesta! Algunas cuestiones me encontré con: a - algunas de las variables de entorno contienen espacios, por lo que la línea antes de la última en el saveagentguión debe ser: echo "export $var=\"$(eval echo '$'$var)\"". b: el latestagentscript debe llamarse con en sourcelugar de sh, por lo que establecer las variables afectará al shell de llamada. c: la invocación latestagentautomática del script al adjuntar tmux se puede realizar mediante el método descrito aquí: unix.stackexchange.com/questions/86925/…
Joe

Gracias @ Joe, modifiqué mi respuesta para incluir sus mejoras.
GnP

0

A menos que desee obtener una secuencia de comandos que contenga todas las variables que necesita en cada shell que genere en cualquier nuevo shell generado por las mismas tmuxsesiones de servidor, es probable que desee indicar tmuxque coloque las variables en la sesión o entornos globales con el set-environmentcomando. Por ejemplo así (para bash):

for var in DISPLAY SSH_AUTH_SOCK ...; do
    tmux setenv "$var" "${!var}"
done

recuerde agregar el -gindicador si también lo desea en otras sesiones y usarlo -t <session>si lo está ejecutando desde fuera tmux.


0

Después de leer las otras respuestas aquí, decidí copiar mi par de claves pública / privada en el servidor remoto, para no tener que preocuparme más por el reenvío de agentes.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.