Plusieurs comptes GitHub et configuration SSH

J’ai du mal à faire jouer ensemble deux clés SSH / comptes GitHub différents. J’ai la configuration suivante:

Repos accessibles depuis un compte à l’aide de git@github.com:accountname

Repos accessibles depuis un autre compte via git@github.com:anotheraccount

Chaque compte a sa propre clé SSH. Les deux clés SSH ont été ajoutées et j’ai créé un fichier de configuration. Je ne crois pas que le fichier de configuration est correct cependant. Je ne suis pas sûr de savoir comment spécifier les git@github.com:accountname en git@github.com:accountname on accède en utilisant git@github.com:accountname doit utiliser id_rsa et git@github.com:anotheraccount doit utiliser id_rsa_anotheraccount .

La réponse d’Andy Lester est précise, mais j’ai trouvé une étape supplémentaire importante à faire pour que cela fonctionne. En essayant de configurer deux profils, un pour le personnel et un pour le travail, mon ~/.ssh/config était à peu près comme suit:

 Host me.github.com HostName github.com PreferredAuthentications publickey IdentityFile ~/.ssh/me_rsa Host work.github.com HostName github.com PreferredAuthentications publickey IdentityFile ~/.ssh/work_rsa 

Mon profil de travail n’a pas pris jusqu’à ce que je fasse un ssh-add ~/.ssh/work_rsa . Après cela, les connexions à github ont utilisé le profil correct. Auparavant, ils utilisaient la première clé publique.

Pour Impossible d’ouvrir une connexion à votre agent d’authentification lors de l’utilisation de ssh-add ,
vérifier: https://stackoverflow.com/a/17695338/1760313

J’ai récemment dû le faire et passer en revue toutes ces réponses et leurs commentaires pour éventuellement rassembler les informations, alors je vais tout mettre ici, en un seul message, pour votre commodité:

Étape 1: clés ssh
Créez les paires de touches dont vous aurez besoin. Dans cet exemple, je me suis nommé par défaut / original “id_rsa” (qui est la valeur par défaut) et mon nouveau “id_rsa-work”:

 ssh-keygen -t rsa -C "stefano@work.com" 

Etape 2: config ssh
Configurez plusieurs profils ssh en créant / modifiant ~ / .ssh / config . Notez les valeurs d’hôte légèrement différentes:

 # Default GitHub Host github.com HostName github.com PreferredAuthentications publickey IdentityFile ~/.ssh/id_rsa # Work GitHub Host work.github.com HostName github.com PreferredAuthentications publickey IdentityFile ~/.ssh/id_rsa_work 

Étape 3: ssh-add
Vous pouvez ou non avoir à le faire. Pour vérifier, répertoriez les empreintes d’identité en exécutant:

 $ ssh-add -l 2048 1f:1a:b8:69:cd:e3:ee:68:e1:c4:da:d8:96:7c:d0:6f stefano (RSA) 2048 6d:65:b9:3b:ff:9c:5a:54:1c:2f:6a:f7:44:03:84:3f stefano@work.com (RSA) 

Si vos entrées ne sont pas là, exécutez:

 ssh-add ~/.ssh/id_rsa_work 

Étape 4: test
Pour tester tout cela correctement, je suggère la vérification rapide suivante:

 $ ssh -T git@github.com Hi stefano! You've successfully authenticated, but GitHub does not provide shell access. $ ssh -T git@work.github.com Hi stefano! You've successfully authenticated, but GitHub does not provide shell access. 

Notez que vous devrez changer le nom d’hôte (github / work.github) en fonction de la clé / identité que vous souhaitez utiliser. Mais maintenant, vous devriez être prêt à partir! 🙂

Disons qu’alice est un utilisateur de github.com, avec 2 référentiels privés ou plus. Pour cet exemple, nous travaillerons avec seulement deux référentiels nommés repo1 et repo2

https://github.com/alice/repo1

https://github.com/alice/repo2

Vous devez être capable de tirer de ces référentiels sans saisir de mots de passe, probablement sur un serveur ou sur plusieurs serveurs. Vous voulez par exemple effectuer le git pull origin master et vous voulez que cela se produise sans demander un mot de passe.

Vous n’aimez pas traiter avec ssh-agent, vous avez découvert (ou vous découvrez maintenant) à propos de ~/.ssh/config un fichier qui permet à votre client ssh de savoir quelle clé privée utiliser selon le nom d’hôte et le nom d’utilisateur, avec un entrée de configuration simple qui ressemble à ceci:

 Host github.com HostName github.com User git IdentityFile /home/alice/.ssh/alice_github.id_rsa IdentitiesOnly yes 

Vous avez donc créé votre paire de clés (alice_github.id_rsa, alice_github.id_rsa.pub) , puis vous êtes également allé dans le fichier .git/config de votre repository et vous avez modifié l’URL de votre origin distante pour qu’elle ressemble à ceci:

 [remote "origin"] url = "ssh://git@github.com/alice/repo1.git" 

Et enfin, vous êtes allé dans la section Settings > Deploy keys du répertoire Settings > Deploy keys et ajouté le contenu de alice_github.id_rsa.pub

À ce stade, vous pouvez faire votre git pull origin master sans entrer de mot de passe sans problème.

mais qu’en est-il du deuxième repository?

Votre instinct sera donc de saisir cette clé et de l’append aux repo2 de déploiement de repo2, mais github.com commettra une erreur et vous indiquera que la clé est déjà utilisée.

Maintenant, vous allez générer une autre clé (en utilisant ssh-keygen -t rsa -C "alice@alice.com" sans mot de passe bien sûr), et pour que cela ne devienne pas un désordre, vous allez maintenant nommer vos clés comme ceci:

  • repo1 : (repo1.alice_github.id_rsa, repo1.alice_github.id_rsa.pub)
  • repo2 : (repo2.alice_github.id_rsa, repo2.alice_github.id_rsa.pub)

Vous allez maintenant mettre la nouvelle clé publique sur la repo2 des clés de déploiement de repo2 sur github.com, mais vous avez maintenant un problème avec ssh.

Comment ssh peut-il indiquer la clé à utiliser si les référentiels sont hébergés sur le même domaine github.com ?

Votre fichier .ssh/config pointe vers github.com et il ne sait pas quelle touche utiliser au moment de tirer.

J’ai donc trouvé un truc avec github.com. Vous pouvez dire à votre client ssh que chaque référentiel réside dans un sous-domaine github.com différent, dans ce cas, ils seront repo1.github.com et repo2.github.com

La première chose à faire est d’éditer les fichiers .git/config sur vos clones de repo, pour qu’ils ressemblent à ceci:

Pour repo1

 [remote "origin"] url = "ssh://git@repo1.github.com/alice/repo1.git" 

Pour repo2

 [remote "origin"] url = "ssh://git@repo2.github.com/alice/repo2.git" 

Et puis, sur votre fichier .ssh/config , vous pourrez maintenant entrer une configuration pour chaque sous-domaine 🙂

 Host repo1.github.com HostName github.com User git IdentityFile /home/alice/.ssh/repo1.alice_github.id_rsa IdentitiesOnly yes Host repo2.github.com HostName github.com User git IdentityFile /home/alice/.ssh/repo2.alice_github.id_rsa IdentitiesOnly yes 

Vous pouvez maintenant git pull origin master sans saisir de mot de passe des deux référentiels.

Si vous avez plusieurs machines, vous pouvez copier les clés sur chacune des machines et les réutiliser, mais je vous conseille de faire le travail de jambe pour générer 1 clé par machine et repository. Vous aurez beaucoup plus de clés à gérer, mais vous serez moins vulnérable si vous êtes compromis.

Utilisez le paramètre IdentityFile dans votre ~/.ssh/config :

 Host github.com HostName github.com IdentityFile ~/.ssh/github.rsa User petdance 

J’ai 2 comptes sur github, et voici ce que j’ai fait (sous linux ) pour le faire fonctionner.

Clés

  • Créez 2 paires de clés rsa, via ssh-keygen , nommez-les correctement afin de vous simplifier la vie.
  • Ajouter des clés privées à l’agent local via ssh-add path_to_private_key
  • Pour chaque compte github, téléchargez une clé publique (distincte).

Configuration

~ / .ssh / config

  Host github-kc Hostname github.com User git IdentityFile ~/.ssh/github_rsa_kc.pub # LogLevel DEBUG3 Host github-abc Hostname github.com User git IdentityFile ~/.ssh/github_rsa_abc.pub # LogLevel DEBUG3 

Définissez url distant pour repo:

  • Pour repo dans l’hôte github-kc :
    git remote set-url origin git@github-kc:kuchaguangjie/pygtrans.git
  • Pour repo dans Host github-abc :
    git remote set-url origin git@github-abc:abcdefg/yyy.git

Explication

Options dans ~/.ssh/config :

  • Host github-
    Host pourrait être n’importe quelle valeur qui pourrait identifier un hôte plus un compte, il n’a pas besoin d’être un véritable hôte, par exemple github-kc identifie un de mes comptes sur github pour mon ordinateur portable local,

    Lorsque vous définissez url distant pour un repository git, c’est la valeur à mettre après git@ , c’est ainsi qu’un repo correspond à un hôte, par exemple git remote set-url origin git@github-kc:kuchaguangjie/pygtrans.git

  • [Voici les sous-options de l’ Host ]
  • Hostname
    spécifiez le nom d’hôte actuel, utilisez simplement github.com pour github,
  • User git
    l’utilisateur est toujours git pour github,
  • IdentityFile
    spécifiez la clé à utiliser, placez simplement le chemin sur la clé publique,
  • LogLevel
    spécifiez le niveau de journalisation à déboguer, le cas échéant, DEBUG3 donne les informations les plus détaillées.

Dans mon cas, aucune des solutions ci-dessus n’a résolu mon problème, mais ssh-agent le fait. Au fond, j’ai fait ce qui suit:

  1. Générez une paire de clés à l’aide de ssh-keygen ci-dessous. Il va générer une paire de clés (dans cet exemple .\keyfile et .\keyfile.pub )

    ssh-keygen -t rsa -b 4096 -C "yourname@yourdomain" -f keyfile

  2. Upload keyfile.pub au fournisseur git

  3. Lancez ssh-agent sur votre machine (vous pouvez vérifier avec ps -ef | grep ssh-agent pour voir s’il fonctionne déjà)
  4. Exécutez ssh-add .\keyfile pour append des informations d’identification
  5. Maintenant, vous pouvez lancer git clone git@provider:username/project.git

J’ai passé beaucoup de temps à comprendre toutes les étapes. Alors décrivons pas à pas:

  1. Créez un nouveau fichier d’identité à l’aide de ssh-keygen -t rsa . Donnez-lui une alternative comme proj1.id_rsa et proj1.id_rsa sans doute parce que vous n’avez pas besoin d’une phrase de passe.
  2. Ajoutez une nouvelle section dans .ssh/config :

    Host proj1.github.com
    HostName github.com PreferredAuthentications publickey IdentityFile ~/.ssh/proj1.id_rsa

Prenez en compte la première section et notez que proj1.github.com sera de retour dans la section plus tard.

  1. Ajoutez l’identité à l’agent ssh-add ~/.ssh/proj1.id_rsa
  2. C’est ce que j’ai gâché la première fois – maintenant, lorsque vous voulez cloner un repository proj1, vous le faites en utilisant proj1.github.com (exactement l’hôte du fichier de configuration). git clone git@proj1.github.com .

Un bon tutoriel.

Ne gâchez pas les hôtes

J’ai utilisé,

 Host github.com HostName github.com IdentityFile ~/.ssh/github_rsa User abc@gmail.com 

Il a bien réveillé.

Utilisez le paramètre ci-dessus dans votre fichier .ssh / config pour différentes clés rsa pour différents noms d’utilisateur.

En complément de la réponse de @stefano, il est préférable d’utiliser la commande avec -f lors de la génération d’une nouvelle clé SSH pour un autre compte,

 ssh-keygen -t rsa -f ~/.ssh/id_rsa_work -C "your@mail.com" 

Puisque le fichier id_rsa_work n’existe pas dans le chemin ~/.ssh/ , et que je crée ce fichier manuellement, et qu’il ne fonctionne pas 🙁

J’utilise des scripts shell pour basculer vers le compte que je veux être “actif”. Essentiellement, vous commencez à partir d’un nouveau démarrage, obtenez un compte correctement configuré et fonctionne, puis déplacez ces fichiers vers un nom avec le préfixe approprié. A partir de là, vous pouvez utiliser la commande “github” ou “gitxyz” pour changer:

 # my github script cd ~/.ssh rm id_rsa rm id_rsa.pub rm config ln git_dhoerl id_rsa ln git_dhoerl.pub id_rsa.pub ln config_dhoerl config git config --global user.email "dhoerl@xyz.com" git config --global github.user "dhoerl" # git config --global github.token "whatever_it_is" # now unused ssh-add -D 

J’ai eu beaucoup de chance avec ça. J’ai également créé un script d’exécution dans Xcode (pour vous, les utilisateurs de Mac) afin qu’il ne construise pas mon projet à moins d’avoir le paramètre approprié (depuis qu’il utilise git):

Exécuter le script placé après les dépendances:

 #! /bin/ksh if [ "$(git config --global --get user.email)" != "dhoerl@.com" ] then exit 1 fi 

Une alternative plus simple à la modification du fichier de configuration ssh (comme suggéré dans toutes les autres réponses) consiste à configurer un référentiel individuel pour utiliser une clé ssh différente (par exemple, autre que celle par défaut).

Dans le référentiel pour lequel vous souhaitez utiliser une clé différente, exécutez:

 git config core.sshCommand 'ssh -i ~/.ssh/id_rsa_anotheraccount' 

Et assurez-vous que votre clé est ajoutée à l’agent ssh en exécutant:

 ssh-add ~/.ssh/id_rsa_anotheraccount 

Gardez à l’esprit que la commande ci-dessus appenda uniquement la clé à l’agent ssh pour votre session en cours. Si vous voulez que cela fonctionne, vous devez l’append “en permanence” à votre agent ssh. Voici comment faire pour Ubuntu et ici pour OSX .

Il devrait également être possible d’adapter cette approche à plusieurs référentiels en utilisant la configuration globale de git et les inclusions conditionnelles ( voir exemple ).