¿Por qué ssh-agent no guardará mi clave no cifrada para su uso posterior?

12

Cada vez que ingreso SSH a otro servidor desde nuestro servidor Ubuntu sin cabeza, se me solicita la contraseña de mi archivo de clave. Incluso si me he conectado previamente al servidor.

¿Tienes alguna idea de por qué esto tal vez? Podría ser algo tan simple como ssh-agentno ejecutarse actualmente o algo así.

La misma clave en mi escritorio Ubuntu Gnome está funcionando bien. Tanto el servidor como el escritorio ejecutan Ubuntu 10.10.

ps -ef | grep '[s]sh-agent'
simon     3219     1  0 12:46 ?        00:00:00 ssh-agent
Treffynnon
fuente
1
Primero, como dijiste, verifica si se ssh-agentestá ejecutando:ps -ef | grep '[s]sh-agent'
Scott Severance
@mssever Sí, parece ser. Ver pregunta actualizada.
Treffynnon

Respuestas:

10

Incluso si el agente está activo, si ciertas variables de entorno no están establecidas, no tiene referencia al agente. Además, incluso si todo está bien, agente y variables, la identidad no se envía automáticamente al agente: esa es una tarea para ssh-askpasstrabajar solo en sesiones X.

Si está utilizando bash, cree el archivo ~/.bash_profilecon este contenido:

# File: ~/.bash_profile

# source ~/.profile, if available
if [[ -r ~/.profile ]]; then
  . ~/.profile
fi

# start agent and set environment variables, if needed
agent_started=0
if ! env | grep -q SSH_AGENT_PID >/dev/null; then
  echo "Starting ssh agent"
  eval $(ssh-agent -s)
  agent_started=1
fi

# ssh become a function, adding identity to agent when needed
ssh() {
  if ! ssh-add -l >/dev/null 2>&-; then
    ssh-add ~/.ssh/id_dsa
  fi
  /usr/bin/ssh "$@"
}
export -f ssh

# another example: git
git() {
  if ! ssh-add -l >/dev/null 2>&-; then
    ssh-add ~/.ssh/id_dsa
  fi
  /usr/bin/git "$@"
}
export -f git

modifique el nombre del archivo ~/.ssh/id_dsasegún sus necesidades y agregue esta línea a~/.bash_logout

# stuff to add at end of ~/.bash_logout
if ((agent_started)); then
  echo "Killing ssh agent"
  ssh-agent -k
fi

Una última nota: esto no interfiere con una sesión de gnome, porque en ese caso solo ~/.profilese obtiene, y puede beneficiarse de la ssh-askpassinterfaz gráfica que solicita una frase de contraseña y la envía al ssh-agent.

enzotib
fuente
Gracias @enzotib, funciona muy bien para sshentrar en otras máquinas. Pero no lo hace cuando se usa gitpara empujar o tirar de un repositorio público. ¿Tienes alguna idea de cómo podría resolver eso también?
Treffynnon
Agregue una función idéntica a ssh(), llámela git()y cambie la última línea de /usr/bin/ssha /usr/bin/git. Además, agregue una línea final con export -f git.
enzotib
@enzotib Lo intenté, pero ahora, cuando entro sshen la máquina con el bash_profilearchivo que creaste arriba, me pide la contraseña de la clave. Por alguna razón, ahora cada vez que entro me pregunta incluso antes de ejecutar ssho git. Visite gist.github.com/942082 para ver el aviso que recibo cuando inicio sesión en la máquina infractora.
Treffynnon
@Treffynnon: no sé exactamente cómo gitinteractuar ssh, y no lo uso gitpara no poder intentarlo. Modifiqué ~/.bash_profilepara incluir la git()función que mencioné anteriormente, para asegurarme de que mi explicación anterior era clara. Además, según el resultado, muestra que modificó la máquina del servidor, pero todos mis consejos se dirigieron solo a la máquina del cliente.
enzotib
@enzotib Eso es correcto. El servidor en el que inicio sesión se convierte en mi cliente cuando gitpresiono a una fragua / depósito central para que el archivo esté en el lugar correcto. Creo que me acabas de dar la pista / agitó mis pensamientos. Tengo un indicador de bash especial que muestra la rama git de pwd. ¡Apuesto a que eso es lo que está activando la solicitud de contraseña al inicio de sesión de bash, ya que intenta obtener estadísticas antes de mostrar el indicador de bash!
Treffynnon
2

Recientemente comencé a usar ssh-ident:

https://github.com/ccontavalli/ssh-ident

todo lo que tienes que hacer es agregar algo como:

alias ssh="/path/to/ssh-ident"

en su .bashrc. Alternativamente, puede ln -s /path/to/ssh-ident ~/bin/ssho algún otro directorio en su RUTA antes /biny /usr/bin.

rabexc
fuente