Comment puis-je faire fonctionner ssh-agent sur ssh et dans tmux (sous OS X)?

17

J'ai une clé privée configurée pour mon compte github, la phrase secrète à laquelle est, je crois, stockée dans le trousseau d'OS X. Je n'ai certainement pas besoin de le saisir lorsque j'ouvre une fenêtre de terminal et que j'entre ssh [email protected].

Cependant, lorsque j'exécute bash sur une session ssh, ou localement dans une session tmux, je dois taper la phrase secrète chaque fois que j'essaie de ssh vers github.

Cette question suggère qu'un problème similaire existe avec l'écran, mais je ne comprends pas assez bien le problème pour le résoudre dans tmux. Il y a aussi cette page qui inclut une solution assez compliquée, mais pour zsh.

MODIFIER :

En réponse à la réponse de @ Mikel , à partir d'un terminal local, j'obtiens la sortie suivante:

[~]
$ echo $SSH_AUTH_SOCK
/tmp/launch-S4HBD6/Listeners
[~] 
$ ssh-add -l
2048 [my key fingerprint] /Users/richie/.ssh/id_rsa (RSA)
[~]
$ typeset -p SSH_AUTH_SOCK
declare -x SSH_AUTH_SOCK="/tmp/launch-S4HBD6/Listeners"

Alors que sur ssh ou dans tmux j'obtiens:

[~]
$ echo $SSH_AUTH_SOCK

[~]
$ ssh-add -l
Could not open a connection to your authentication agent.
[~]
$ typeset -p SSH_AUTH_SOCK
bash: typeset: SSH_AUTH_SOCK: not found

echo $SSH_AGENT_PID ne renvoie rien quel que soit le shell à partir duquel je l'exécute.

Riches
la source
Et alors typeset -p SSH_AUTH_SOCK?
Mikel
@Mikel bash: typeset: SSH_AUTH_SOCK: not founddepuis ssh / tmux. Je vais l'essayer localement ce soir, si nécessaire.
Rich
@Mikel J'ai ajouté la sortie de cette commande à la question.
Rich
AFAIK, les questions et réponses ne sont pas spécifiques à OS X. Cela est pertinent pour éviter certains doublons non spécifiques à OS X, à savoir superuser.com/q/334975/46794 et superuser.com/q/479796/46794 .
Blaisorblade
@Blaisorblade J'avais l'impression que ma phrase secrète était stockée dans le trousseau OS X (bien que je ne me souvienne pas maintenant pourquoi je pensais que c'était le cas). Est-ce que c'est incorrect?
Rich

Réponses:

4

Mon collègue a créé quelques fonctions bash pour aider à trouver un agent en direct: https://github.com/wwalker/ssh-find-agent

Il l'utilise principalement pour la connexion entre les systèmes (ordinateur portable à ordinateur de bureau, etc.), mais je l'utilise le plus souvent pour les sessions tmux locales où vous vous déconnectez / vous connectez à partir de votre gestionnaire de fenêtres (OS X pour moi).

Usage

  1. Téléchargez ssh-find-agent.bash ( git clone git://github.com/wwalker/ssh-find-agent.gitfonctionne).

  2. Ajoutez ce qui suit à ~ / .bashrc:

    . /path/to/ssh-find-agent.bash
    
  3. Ensuite, vous pouvez taper ce qui suit pour définir SSH_AUTH_SOCK dans votre shell actuel:

    set_ssh_agent_socket
    
user104502
la source
J'ai accepté cette réponse plutôt que toute autre qui pourrait fonctionner car elle ne nécessite pas de transfert d'agent SSH, ce qui est mieux pour moi. Merci!
Rich
8

Une solution élégante, reprise de dagit.o :

Créer ~/.ssh/rc

#!/bin/bash
if [ -S "$SSH_AUTH_SOCK" ]; then
    ln -sf $SSH_AUTH_SOCK ~/.ssh/ssh_auth_sock
fi

Ajouter à ~/.tmux.conf

set -g update-environment "DISPLAY SSH_ASKPASS SSH_AGENT_PID SSH_CONNECTION WINDOWID XAUTHORITY"
set-environment -g 'SSH_AUTH_SOCK' ~/.ssh/ssh_auth_sock
mislav
la source
7

Dans votre .tmux.conffichier de configuration, ajoutez cette ligne:

set -g update-environment "SSH_ASKPASS SSH_AUTH_SOCK SSH_AGENT_PID SSH_CONNECTION"

Cela entraîne la copie de ces variables d'environnement de votre shell principal vers tous les shells ouverts dans tmux, ce qui permet à ssh-agent de fonctionner correctement dans ces shells tmux.

Trevor Powell
la source
2
C'est la méthode appropriée pour obtenir ces valeurs dans une session tmux , mais toutes ces variables d'environnement doivent déjà être incluses dans la valeur par défaut de update-environment. L'OP doit vérifier leur update-environmentvaleur et éventuellement la mettre à jour là où elle est déjà en cours de modification.
Chris Johnsen
1
Hm .. après avoir creusé plus loin, je suis d'accord - les paramètres que j'ai énumérés sont déjà dans les valeurs par défaut, et si je lance tmux sans un fichier .tmux.conf, tout fonctionne correctement. Et si je supprime la ligne que j'ai citée de mon fichier .tmux.conf, cela fonctionne aussi pour moi, bien que ce ne soit pas le cas auparavant. Il y a clairement quelque chose qui va mal de temps en temps. Peut-être à faire avec suspendre / restaurer ou attacher / détacher ou sshing dans une session tmux à distance. Je garderai les yeux ouverts et mettrai à jour si je trouve le facteur qui le rend reproductible.
Trevor Powell
update-environmentest réglé correctement. Cependant, le problème persiste.
Rich
2
Le problème avec ceci est que la configuration ne sera réexécutée que si aucun tmuxserveur n'est présent, défiant le but de la réattacher ... Peut-être qu'il y a un commutateur de ligne de commande pour mettre à jour ces variables?
Tobias Kienzler
3

Il m'est arrivé que des volets créés lors de la connexion via ssh à partir d'OS X ont commencé à demander ma phrase de passe après un certain temps de travail ok. J'ai trouvé un moyen de résoudre ce problème en volant cette ligne à partir de http://santini.di.unimi.it/extras/ph/my-tmux-setup.html

eval $(tmux show-environment -t [YOUR-SESSION] | grep '^SSH_AUTH_SOCK')

Il suffit de l'exécuter à partir du volet qui se plaint.

user1153623
la source
2

Je ne sais pas si vous utilisez bash ou un autre shell, mais la configuration tmux de ce type semble fonctionner pour bash. Personnellement, j'utilise zsh avec oh-my-zsh , et j'ai trouvé que ssh-agent a commencé à travailler dans tmux après avoir ajouté

zstyle :omz:plugins:ssh-agent agent-forwarding on

dans mon fichier .zshrc et rechargé la configuration dans mes sessions zsh en cours d'exécution. J'ai également trouvé la solution orientée zsh de ce type , mais cela s'est avéré inutile pour moi.

cwjohnston
la source
1

Qu'est-ce que:

echo $SSH_AUTH_SOCK
echo $SSH_AGENT_PID
ssh-add -l

impression?

Exécutez-le dans votre terminal normal, puis exécutez-le dans votre tmuxsession. Ils devraient imprimer la même chose.

Mikel
la source
J'ai ajouté la réponse à ces commandes à la question. J'ai également réalisé que le problème se produit également lorsque je me connecte via ssh (sans utiliser tmux), et j'ai modifié la question en conséquence.
Rich
4
sshest facile. Activez le transfert d'agent. Le moyen le plus simple de le faire est d'exécuter ssh -Aau lieu de ssh. Utilisez un alias pour ne pas avoir à le saisir à chaque fois ou à le mettre dans votre .SSH/config.
Mikel
Cool merci. Cela a fonctionné pour ssh. Des idées pour le réparer dans tmux?
Rich
0

Il existe de nombreuses solutions, mais la plus simple se trouve dans la réponse de Hans Ginzel, datée du 8 janvier 2016, à une question StackOverflow connexe datée du 27 janvier 2014 . Ajoutez simplement ce qui suit à votre coque ~/.profileou similaire:

alias ssh='eval $(tmux show-env -s | grep "^SSH_") && ssh'

Il n'est pas nécessaire de définir des fonctions multilignes ou de créer de nouveaux fichiers temporaires. Si vous ne voulez pas d'alias ssh, changez-le simplement en fixsshet supprimez-le && sshà la fin, et exécutez-le fixsshchaque fois que vous essayez de l'exécuter sshdepuis l'intérieur d'une session tmux réattachée.

La réponse de Hans Ginzel suggère qu'une «nouvelle version» de tmux est nécessaire pour fonctionner show-env -s. Cela fonctionne pour moi dans tmux 2.7, et à ma lecture du changelog , a -sété ajouté le 3 juin 2008 juste avant la sortie de tmux 0.3. tmux 2.3 (29 septembre 2016) est dans Debian stable.

sjy
la source