Comment puis-je transférer une clé ssh déjà transférée dans tmux?

15

Je me connecte via SSH à partir d'une machine sur laquelle mes clés sont stockées, je les transfère vers une deuxième machine, puis j'essaie d'utiliser les clés à partir de tmux. Il me semble "perdre" la redirection en entrant dans tmux. Comment "transférer à nouveau" pour pouvoir utiliser mes clés depuis 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)
user50849
la source
Je confirme que si vous lancez un agent partagé entre toutes vos sessions, ça marche. La documentation sur bose.utmb.edu/Compu_Center/ssh/SSH_HOWTO.html > Configure ssh-agent Process explique une méthode pour atteindre ce résultat.
Dereckson
Également pertinent: unix.stackexchange.com/questions/75681/…
Joe

Réponses:

12

Si vous attachez une session tmux déjà existante, le shell n'hérite pas des variables d'environnement de votre shell de connexion. En particulier, il n'héritera pas des variables d'environnement de l'agent ssh.

Essayez ce correctif :

  1. Créez ce script et placez-le dans $ 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. Ajoutez-le à votre script de démarrage du shell. Par exemple, si vous utilisez bash:

    echo '. ~/.ssh/saveagent' >> ~/.bash_login
  3. Après avoir attaché le tmux, exécutez . $HOME/.ssh/latestagent

Voir aussi Comment puis-je exécuter un script immédiatement après la connexion via SSH? et attacher à la session tmux et exécuter une commande

GnP
la source
1
Envoyer à .profile peut-être, si vous essayez d'être compatible avec d'autres shells.
Dereckson
2
Très bonne réponse! Quelques questions je suis tombé sur: a - quelques - unes des variables d' environnement contiennent des espaces, de sorte que la ligne avant dernière dans le saveagentscript doit être: echo "export $var=\"$(eval echo '$'$var)\"". b - le latestagentscript doit être appelé avec sourceau lieu de sh, donc la définition des variables affectera le shell appelant. c - l'appel latestagentautomatique du script lors de l'attachement de tmux peut être fait via la méthode décrite ici: unix.stackexchange.com/questions/86925/…
Joe
Merci @Joe, j'ai modifié ma réponse pour inclure vos améliorations.
GnP
0

À moins que vous ne vouliez source un script contenant toutes les variables dont vous avez besoin dans chaque shell que vous générez dans un nouveau shell généré par les mêmes tmuxsessions de serveur, vous voudrez probablement dire tmuxde mettre les variables dans la session ou les environnements globaux avec la set-environmentcommande. Par exemple, comme ceci (pour bash):

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

n'oubliez pas d'ajouter le -gdrapeau si vous le souhaitez également dans d'autres sessions et de l'utiliser -t <session>si vous l'exécutez de l'extérieur de tmux.

peterph
la source
0

Après avoir lu les autres réponses ici, j'ai décidé de simplement copier ma paire de clés publique / privée sur le serveur distant, afin de ne plus avoir à me soucier du transfert d'agent.

M. Scott Ford
la source