Pourquoi ssh-agent n'enregistre-t-il pas ma clé non chiffrée pour une utilisation ultérieure?

12

Chaque fois que je me connecte à un autre serveur depuis notre serveur sans tête Ubuntu, on me demande le mot de passe de mon fichier de clés. Même si je me suis déjà connecté au serveur.

Avez-vous une idée pourquoi cela peut-être? Ce pourrait être quelque chose d'aussi simple que de ssh-agentne pas être en cours d'exécution ou quelque chose.

La même clé sur mon bureau Ubuntu Gnome fonctionne bien. Le serveur et le bureau exécutent Ubuntu 10.10.

ps -ef | grep '[s]sh-agent'
simon     3219     1  0 12:46 ?        00:00:00 ssh-agent
Treffynnon
la source
1
Tout d'abord, comme vous l'avez dit, vérifiez si ssh-agentfonctionne:ps -ef | grep '[s]sh-agent'
Scott Severance
@mssever Oui, cela semble être le cas. Voir la question mise à jour.
Treffynnon

Réponses:

10

Même si l'agent est actif, si certaines variables d'environnement ne sont pas définies, vous n'avez aucune référence à l'agent. De plus, même si tout va bien, l'agent et les variables, l'identité n'est pas automatiquement envoyée à l'agent: c'est une tâche pour ssh-askpass, fonctionnant uniquement dans les sessions X.

Si vous utilisez bash, créez le fichier ~/.bash_profileavec ce contenu:

# 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

modifiez le nom du fichier ~/.ssh/id_dsaselon vos besoins et ajoutez cette ligne à~/.bash_logout

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

Une dernière remarque: cela n'interfère pas avec une session gnome, car dans ce cas seul ~/.profileest sourcé, et vous pouvez bénéficier de l' ssh-askpassinterface graphique qui demande une phrase secrète et l'envoie à la ssh-agent.

enzotib
la source
Merci à @enzotib pour son excellent travail sshdans d'autres machines. Mais ce n'est pas le cas lors de l'utilisation gitpour pousser ou tirer sur un référentiel public. Avez-vous des idées pour résoudre ce problème également?
Treffynnon le
Ajoutez une fonction identique à ssh(), appelez-la git()et changez la dernière ligne de /usr/bin/sshà /usr/bin/git. Ajoutez également une dernière ligne avec export -f git.
enzotib
@enzotib J'ai essayé cela, mais maintenant quand je suis sshdans la machine avec le bash_profilefichier que vous avez créé ci-dessus, il me demande le mot de passe de la clé. Pour une raison quelconque, maintenant, chaque fois que je ssh, il demande avant même d'avoir exécuté sshou git. Voir gist.github.com/942082 pour l'invite que je reçois lorsque je me connecte à la machine incriminée.
Treffynnon
@Treffynnon: Je ne sais pas exactement comment gitinteragir avec ssh, et je ne l'utilise pas gitpour ne pas pouvoir essayer. J'ai modifié le ~/.bash_profilepour inclure la git()fonction que j'ai mentionnée ci-dessus, pour être sûr que mon explication précédente était claire. De plus, il semble d'après la sortie que vous montrez que vous avez modifié la machine serveur, mais tous mes conseils étaient dirigés uniquement vers la machine cliente.
enzotib
@enzotib C'est exact. Le serveur auquel je me connecte devient mon client lorsque je le gitpousse vers une forge / un référentiel central afin que le fichier soit au bon endroit. Je pense que vous venez de me donner l'astuce / jogged mes pensées. J'ai une invite bash spéciale qui affiche la branche git du pwd. Je parie que c'est ce qui déclenche la demande de mot de passe lors de la connexion bash alors qu'il tente de git stat avant de rendre l'invite bash!
Treffynnon
2

J'ai récemment commencé à utiliser ssh-ident:

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

tout ce que vous avez à faire est d'ajouter quelque chose comme:

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

dans votre .bashrc. Alternativement, vous pouvez ln -s /path/to/ssh-ident ~/bin/sshou un autre répertoire de votre PATH avant /binet /usr/bin.

rabexc
la source