J'essaie de trouver un moyen agréable de restaurer l'agent SSH lorsque je reconnecte une session tmux déconnectée.
La cause semble être que la session de l'agent SSH a changé mais que la variable d'environnement de la session tmux n'est pas mise à jour.
Comment puis-je automatiser cela, avant de joindre la session elle-même? Parce que la session à laquelle je m'attache n'a pas toujours d'invite bash, je ne peux donc pas me permettre de taper quelque chose à l'intérieur. Cela doit être quelque chose à exécuter avant de créer ou de joindre la session tmux.
Un exemple de code que j'utilise est la suivante: https://Gist.github.com/ssbarnea/8646491 - un petit wrapper ssh qui utilise tmux pour créer des connexions ssh persistem. Cela fonctionne assez bien, mais parfois l'agent ssh cesse de fonctionner et je ne peux plus l'utiliser pour me connecter à d'autres hôtes.
Il existe un excellent Gist de Martijn Vermaat, qui traite votre problème en profondeur, même s’il est destiné aux utilisateurs d’écran, je l’ajuste donc ici pour tmux.
Résumer:
créez ~/.ssh/rc
s'il n'existe pas encore et ajoutez le contenu suivant:
#!/bin/bash
# Fix SSH auth socket location so agent forwarding works with tmux
if test "$SSH_AUTH_SOCK" ; then
ln -sf $SSH_AUTH_SOCK ~/.ssh/ssh_auth_sock
fi
Faites-le fonctionner dans tmux, ajoutez ceci à votre ~/.tmux.conf
:
# fix ssh agent when tmux is detached
setenv -g SSH_AUTH_SOCK $HOME/.ssh/ssh_auth_sock
Un travail supplémentaire est nécessaire si vous souhaitez activer le transfert X11, voir Gist .
Alors que tmux
updatesSSH
variables par défaut, il n’est pas nécessaire de
SSH_AUTH_SOCKET
J'aime la solution de Chris Down que j'ai modifiée pour ajouter une fonction
fixssh() {
eval $(tmux show-env \
|sed -n 's/^\(SSH_[^=]*\)=\(.*\)/export \1="\2"/p')
}
dans ~/.bashrc
. Appelez fixssh
après l'attachement de session ou avant la ssh
/scp
/rsync
.
Les versions plus récentes de tmux
prennent en charge l'option -s
pour show-env
, donc uniquement
eval $(tmux show-env -s |grep '^SSH_')
est possible.
Voici ce que j'utilise pour mettre à jour SSH_AUTH_SOCK
dans une fenêtre tmux
(basée sur le script de Hans Ginzel):
alias fixssh='eval $(tmux showenv -s SSH_AUTH_SOCK)'
Ou pour tmux
qui n'a pas showenv -s
:
alias fixssh='export $(tmux showenv SSH_AUTH_SOCK)'
Voici ma solution qui inclut les deux approches et ne nécessite pas de frappe supplémentaire lorsque je me reconnecte à la session tmux
alias ssh='[ -n "$TMUX" ] && eval $(tmux showenv -s SSH_AUTH_SOCK); /usr/bin/ssh'
J'utilise une variante des réponses précédentes:
eval "export $(tmux show-environment -g SSH_AUTH_SOCK)"
en supposant que vous ayez créé l'agent ssh à partir de l'environnement externe. Il en va de même pour les autres variables d'environnement telles que DISPLAY
.
Il y a beaucoup de bonnes réponses ici. Mais il y a des cas où tmux show-environment
ne voit pas SSH_AUTH_SOCK
. Dans ce cas, vous pouvez utiliser find
pour le localiser explicitement.
export SSH_AUTH_SOCK=$(find /tmp -path '*/ssh-*' -name 'agent*' -uid $(id -u) 2>/dev/null | tail -n1)
C'est long et compliqué, alors je vais le décomposer ...
01 export SSH_AUTH_SOCK=$(
02 find /tmp \
03 -path '*/ssh-*'
04 -name 'agent*'
05 -uid $(id -u)
06 2>/dev/null
07 | tail -n1
08 )
export
la variable d'environnement SSH_AUTH_SOCK
définie sur la sortie de la substitution de commande $()
find
fichiers commençant par /tmp
/ssh-
dans le cheminagent
Vous pourrez peut-être laisser 6 & 7 si vous savez qu'il n'y aura qu'un seul résultat et que vous ne vous souciez pas de Stderr garbage.
Je préfère éviter de configurer TMUX (etc.) et de tout conserver dans le code ~/.ssh/
. Sur le remote system:
Créer ~/.ssh/rc
:
#!/bin/bash
# Fix SSH auth socket location so agent forwarding works within tmux
if test "$SSH_AUTH_SOCK" ; then
ln -sf $SSH_AUTH_SOCK ~/.ssh/ssh_auth_sock
fi
Ajoutez ce qui suit à ~/.ssh/config
pour qu'il ne s'appuie plus sur $SSH_AUTH_SOCK
, qui est périmé dans les terminaux isolés:
Host *
IdentityAgent ~/.ssh/ssh_auth_sock
ssh-add
n'utilise pas ~/.ssh/config
et ne peut donc pas communiquer avec ssh-agent
. Des commandes telles que ssh-add -l
produisent des erreurs, même si ssh user@Host
fonctionne correctement, tout comme la mise à jour des télécommandes git accessibles via SSH.