web-dev-qa-db-fra.com

Comment mettre à jour automatiquement les variables d'environnement de l'agent SSH lors de la connexion à des sessions tmux existantes

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.

58
sorin

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:

  1. 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
    
  2. 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 .

69
pymkin

Alors que tmuxupdatesSSH variables par défaut, il n’est pas nécessaire de

  • changer/ajouter un chemin de socket
  • changer la variable 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.

23
Hans Ginzel

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)'
15
user1338062

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'
3
Max

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.

3
Raffi

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  )
  1. export la variable d'environnement SSH_AUTH_SOCK définie sur la sortie de la substitution de commande $()
  2. find fichiers commençant par /tmp
  3. limiter les résultats à ceux avec /ssh- dans le chemin
  4. limiter les résultats à ceux dont le nom commence par agent
  5. limiter les résultats à ceux dont l'identifiant correspond à l'utilisateur actuel
  6. couper toutes les erreurs (autorisations, etc.)
  7. prendre que le dernier résultat s'il y a plusieurs

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.

2
Bruno Bronosky

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

Limitations connues

  • 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.
1
RobM