¿Cómo puedo hacer que ssh-agent funcione sobre ssh y en tmux (en OS X)?

17

Tengo una clave privada configurada para mi cuenta de github, la frase de contraseña a la que, creo, está almacenada en el llavero de OS X. Ciertamente no tengo que escribirlo cuando abro una ventana de terminal y entro ssh [email protected].

Sin embargo, cuando ejecuto bash sobre una sesión ssh, o localmente dentro de una sesión tmux, tengo que escribir la frase de contraseña cada vez que intento ssh a github.

Esta pregunta sugiere que existe un problema similar con la pantalla, pero realmente no entiendo el problema lo suficientemente bien como para solucionarlo en tmux. También existe esta página que incluye una solución bastante complicada, pero para zsh.

EDITAR :

En respuesta a la respuesta de @ Mikel , desde un terminal local obtengo el siguiente resultado:

[~]
$ echo $SSH_AUTH_SOCK
/tmp/launch-S4HBD6/Listeners
[~] 
$ ssh-add -l
2048 [my key fingerprint] /Users/richie/.ssh/id_rsa (RSA)
[~]
$ typeset -p SSH_AUTH_SOCK
declare -x SSH_AUTH_SOCK="/tmp/launch-S4HBD6/Listeners"

Mientras que sobre ssh o en tmux obtengo:

[~]
$ echo $SSH_AUTH_SOCK

[~]
$ ssh-add -l
Could not open a connection to your authentication agent.
[~]
$ typeset -p SSH_AUTH_SOCK
bash: typeset: SSH_AUTH_SOCK: not found

echo $SSH_AGENT_PID no devuelve nada desde el shell desde el que lo ejecuto.

Rico
fuente
¿Qué hay de typeset -p SSH_AUTH_SOCK?
Mikel
@Mikel bash: typeset: SSH_AUTH_SOCK: not founddesde ssh / tmux. Lo intentaré localmente esta noche, si es necesario.
Rico
@Mikel He agregado el resultado de ese comando a la pregunta.
Rico
AFAIK, las preguntas y las respuestas no son específicas de OS X. Eso es relevante para evitar algunos dups no OS X-específicas, a saber superuser.com/q/334975/46794 y superuser.com/q/479796/46794 .
Blaisorblade
@Blaisorblade Tenía la impresión de que mi frase de contraseña estaba almacenada en el llavero OS X (aunque ahora no recuerdo por qué creía que ese era el caso). ¿Eso es incorrecto?
Rico

Respuestas:

4

Mi colega creó algunas funciones bash para ayudar a encontrar un agente en vivo: https://github.com/wwalker/ssh-find-agent

Lo usa principalmente para conectarse entre sistemas (computadora portátil a escritorio, etc.), pero lo uso con mayor frecuencia para sesiones tmux locales en las que cierra sesión / inicia sesión desde su administrador de ventanas (OS X para mí).

Uso

  1. Descargar ssh-find-agent.bash ( git clone git://github.com/wwalker/ssh-find-agent.gitfunciona).

  2. Agregue lo siguiente a ~ / .bashrc:

    . /path/to/ssh-find-agent.bash
    
  3. Luego puede escribir lo siguiente para establecer SSH_AUTH_SOCK en su shell actual:

    set_ssh_agent_socket
    
usuario104502
fuente
Acepté esta respuesta en lugar de cualquiera de las otras que podrían funcionar porque no requiere el reenvío del agente SSH, lo cual es mejor para mis propósitos. ¡Gracias!
Rico
8

Una solución elegante, recogida de dagit.o :

Crear ~/.ssh/rc

#!/bin/bash
if [ -S "$SSH_AUTH_SOCK" ]; then
    ln -sf $SSH_AUTH_SOCK ~/.ssh/ssh_auth_sock
fi

añadir ~/.tmux.conf

set -g update-environment "DISPLAY SSH_ASKPASS SSH_AGENT_PID SSH_CONNECTION WINDOWID XAUTHORITY"
set-environment -g 'SSH_AUTH_SOCK' ~/.ssh/ssh_auth_sock
mislav
fuente
7

En su .tmux.confarchivo de configuración, agregue esta línea:

set -g update-environment "SSH_ASKPASS SSH_AUTH_SOCK SSH_AGENT_PID SSH_CONNECTION"

Esto hace que estas variables de entorno se copien de su shell principal a cualquier shells abiertos dentro de tmux, lo que permite que ssh-agent funcione correctamente dentro de esos tmux shells.

Trevor Powell
fuente
2
Este es el método apropiado para obtener esos valores en una sesión tmux , pero todas esas variables de entorno ya deberían estar incluidas en el valor predeterminado de update-environment. El OP debe verificar su update-environmentvalor y posiblemente actualizarse donde ya se esté cambiando.
Chris Johnsen
1
Hm ... después de profundizar más, acepto: la configuración que enumeré ya está en los valores predeterminados, y si ejecuto tmux sin un archivo .tmux.conf, todo funciona correctamente. Y si elimino la línea que cité de mi archivo .tmux.conf, eso también funciona para mí, aunque no antes. Claramente, algo más sale mal ocasionalmente. Tal vez tenga que ver con suspender / restaurar o adjuntar / separar o sshing en una sesión tmux de forma remota. Mantendré mis ojos abiertos y actualizaré si encuentro el factor que lo hace reproducible.
Trevor Powell
update-environmentestá configurado correctamente Sin embargo, el problema aún ocurre.
Rico
2
El problema con esto es que la configuración solo se volverá a ejecutar cuando no haya ningún tmuxservidor presente, desafiando el propósito de volver a conectar ... ¿Tal vez hay un interruptor de línea de comando para volver a actualizar esas variables?
Tobias Kienzler
3

Me sucedió que los paneles creados al conectarse a través de ssh desde OS X comenzaron a preguntar mi frase de contraseña después de un tiempo de trabajo. Encontré una manera de arreglar eso robando esta línea de http://santini.di.unimi.it/extras/ph/my-tmux-setup.html

eval $(tmux show-environment -t [YOUR-SESSION] | grep '^SSH_AUTH_SOCK')

Simplemente ejecútalo desde el panel que se queja.

usuario1153623
fuente
2

No estoy seguro de si está usando bash u otro shell, pero la configuración tmux de este tipo parece que funcionaría para bash. Personalmente, estoy usando zsh con oh-my-zsh , y descubrí que ssh-agent comenzó a trabajar en tmux después de agregar

zstyle :omz:plugins:ssh-agent agent-forwarding on

a mi archivo .zshrc y volví a cargar la configuración en mis sesiones zsh en ejecución. También encontré la solución orientada a zsh de este tipo , pero resultó ser innecesaria para mí.

cwjohnston
fuente
1

Que hace:

echo $SSH_AUTH_SOCK
echo $SSH_AGENT_PID
ssh-add -l

¿impresión?

Ejecútelo en su terminal normal, luego ejecútelo dentro de su tmuxsesión. Deberían imprimir lo mismo.

Mikel
fuente
Agregué la respuesta a estos comandos a la pregunta. También me di cuenta de que el problema también ocurre cuando inicio sesión a través de ssh (sin usar tmux), y he editado la pregunta en consecuencia.
Rico
44
sshes fácil. Active el reenvío de agente. La forma más fácil de hacerlo es ejecutarlo en ssh -Alugar de hacerlo ssh. Use un alias para no tener que escribirlo todo el tiempo o ponerlo en su .SSH/config.
Mikel
Genial, gracias. Eso funcionó para SSH. ¿Alguna idea de cómo solucionarlo en tmux?
Rico
0

Hay muchas soluciones, pero la más simple se encuentra en la respuesta de Hans Ginzel, del 8 de enero de 2016, a una pregunta relacionada de StackOverflow del 27 de enero de 2014 . Simplemente agregue lo siguiente a su shell ~/.profileo similar:

alias ssh='eval $(tmux show-env -s | grep "^SSH_") && ssh'

No es necesario definir funciones de varias líneas o crear nuevos archivos temporales. Si no desea un alias ssh, simplemente cámbielo fixsshy elimínelo && sshal final, y ejecútelo fixsshsiempre que intente ejecutarlo sshdesde una sesión tmux reenganchada.

La respuesta de Hans Ginzel sugiere que se requiere una 'versión más nueva' de tmux para ejecutarse show-env -s. Esto funciona para mí en tmux 2.7, y en mi lectura del registro de cambios , -sse agregó el 3 de junio de 2008 justo antes del lanzamiento de tmux 0.3. tmux 2.3 (29 de septiembre de 2016) está en Debian estable.

sjy
fuente