web-dev-qa-db-fra.com

Plusieurs comptes GitHub et configuration SSH

J'ai du mal à faire en sorte que deux clés SSH/comptes GitHub différents fonctionnent bien ensemble. J'ai la configuration suivante:

Les pensions accessibles depuis un compte en utilisant [email protected]:accountname

Les pensions accessibles depuis un autre compte en utilisant [email protected]: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 sais pas trop comment spécifier le dépôt auquel on a accédé à l'aide de [email protected]:accountname devrait utiliser id_rsa et [email protected]:anotheraccount devrait utiliser id_rsa_anotheraccount

229
radesix

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

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 j'ai fait un ssh-add ~/.ssh/work_rsa. Après cela, les connexions à github utilisaient le bon profil. Auparavant, ils utilisaient par défaut la première clé publique.

Pour Impossible d'ouvrir une connexion à votre agent d'authentification en utilisant ssh-add,
vérifier: https://stackoverflow.com/a/17695338/1760313

291
Jim Wrubel

J'ai récemment eu à faire cela et à passer au crible toutes ces réponses et leurs commentaires pour finalement rassembler les informations. Je vais donc tout mettre ici, dans un post, pour votre commodité:


Etape 1: touches ssh  
Créez toutes les paires de clés dont vous aurez besoin. Dans cet exemple, j'ai nommé moi par défaut/original 'id_rsa' (qui est la valeur par défaut) et mon nouveau 'id_rsa-work':

ssh-keygen -t rsa -C "[email protected]"


Étape 2: ssh config  
Configurez plusieurs profils ssh en créant/modifiant ~/.ssh/config . Notez les valeurs 'Host' 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 à faire cela. Pour vérifier, lister 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 [email protected] (RSA)

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

ssh-add ~/.ssh/id_rsa_work


Étape 4: test  
Pour vérifier que vous avez bien fait tout cela, je suggère la vérification rapide suivante:

$ ssh -T [email protected]
Hi stefano! You've successfully authenticated, but GitHub does not provide Shell access.

$ ssh -T [email protected]
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é/de l'identité que vous souhaitez utiliser. Mais maintenant, vous devriez être prêt à partir! :)

158
stefano

Disons que alice est un utilisateur de github.com, avec au moins deux référentiels privés repoN. Pour cet exemple, nous ne travaillerons qu'avec deux référentiels nommés repo1 et repo2.

https://github.com/alice/repo1

https://github.com/alice/repo2

Vous devez extraire de ces référentiels sans entrer de mots de passe probablement sur un serveur ou sur plusieurs serveurs . Vous voulez exécuter git pull Origin master par exemple, et vous voulez que cela se produise sans demander de 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 indiquant à votre client ssh quelle clé privée utiliser en fonction du nom d'hôte et du nom d'utilisateur, avec une simple entrée de configuration comme ça:

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 référentiel et vous avez modifié l'URL de votre Origin distante pour qu'elle ressemble à ceci:

[remote "Origin"]
        url = "ssh://[email protected]/alice/repo1.git"

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

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

mais qu'en est-il du deuxième référentiel?

Votre instinct sera donc de saisir cette clé et de l’ajouter aux clés de déploiement de repo2, mais github.com se trompera et vous dira que la clé est déjà utilisée.

Maintenant, vous allez générer une autre clé (en utilisant ssh-keygen -t rsa -C "[email protected]" sans les mots de passe bien sûr), et pour que cela ne devienne pas un gâchis, vous allez maintenant nommer vos clés comme suit:

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

Vous allez maintenant placer la nouvelle clé publique dans la configuration des clés de déploiement de repo2 sur github.com, mais vous devez maintenant résoudre un problème ssh. 

Comment ssh peut-il savoir quelle 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 clé utiliser quand il est temps de tirer.

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

La première chose à faire est donc d’éditer les fichiers .git/config sur vos clones de référentiel, ils se présentent ainsi:

Pour repo1

[remote "Origin"]
        url = "ssh://[email protected]/alice/repo1.git"

Pour repo2

[remote "Origin"]
        url = "ssh://[email protected]/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 entrer 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 conseillerais d'effectuer le travail préliminaire pour générer 1 clé par machine et par dépôt. Vous aurez beaucoup plus de clés à manipuler, mais vous serez moins vulnérable si une personne est compromise.

38
Gubatron

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

Clés

  • Créez 2 paires de clés RSA, via ssh-keygen, nommez-les correctement pour faciliter 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éfinir l'URL distante pour le repo:

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

Explication

Options dans ~/.ssh/config:

  • Host github- <identifier_specific_user> 
    Hôte peut être n’importe quelle valeur permettant d’identifier un hôte et un compte, Il n’est pas nécessaire qu’il soit 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 l'URL distante pour un dépôt Git, il s'agit de la valeur à mettre après git@. C'est ainsi que le dépôt s'aligne sur un hôte, par exemple git remote set-url Origin git@github-kc:kuchaguangjie/pygtrans.git.


  • [Voici les sous-options de Host]
  • Hostname 
    spécifiez le nom d'hôte réel, utilisez simplement github.com pour github,
  • User git 
    l'utilisateur est toujours git pour github,
  • IdentityFile 
    spécifier la clé à utiliser, il suffit de mettre le chemin de la clé publique,
  • LogLevel 
    Spécifiez le niveau de journalisation à déboguer. Si un problème survient, DEBUG3 donne les informations les plus détaillées.

18
Eric Wang

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

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

Dans mon cas, aucune des solutions ci-dessus n'a résolu mon problème, contrairement à ssh-agent. En gros, j'ai fait ce qui suit:

  1. Générez une paire de clés en utilisant ssh-keygen comme indiqué 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. Transférez keyfile.pub chez le fournisseur git

  3. Démarrez 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 ajouter des informations d'identification
  5. Maintenant, vous pouvez exécuter git clone git@provider:username/project.git
2
berniey

J'ai passé beaucoup de temps à comprendre toutes les étapes. Décrivons donc étape par étape:

  1. Créez un nouveau fichier d'identité à l'aide de ssh-keygen -t rsa. Donnez-lui une alternative comme proj1.id_rsa et tapez sans aucun doute, car vous n'avez pas besoin de phrase secrète.
  2. Ajouter 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 nous reviendrons à la section plus tard.

  1. Ajouter l'identité à l'agent ssh ssh-add ~/.ssh/proj1.id_rsa
  2. C'est ce que je me suis trompé la première fois - maintenant, quand vous voulez cloner un repo proj1, vous le faites en utilisant proj1.github.com (exactement l'hôte du fichier de configuration) .git clone [email protected].

Un bon tutoriel.

Ne vous trompez pas avec les hôtes

2
I159

J'utilise des scripts Shell pour me connecter à n'importe quel compte sur lequel je veux être "actif". Essentiellement, vous démarrez d'un nouveau départ, configurez un compte correctement et qu'il fonctionne correctement, puis déplacez ces fichiers vers un nom avec le préfixe approprié. À partir de là, vous pouvez utiliser la commande "github" ou "gitxyz" pour passer:

# 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 "[email protected]"
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, utilisateurs Mac) afin qu'il ne construise pas mon projet à moins de disposer du paramètre approprié (car il utilise git):

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

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

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 "[email protected]"

Étant donné que le fichier id_rsa_work n'existe pas dans le chemin ~/.ssh/, et que je crée ce fichier manuellement, il ne fonctionne pas :( 

1
li2

J'ai utilisé,

Host github.com
   HostName github.com
   IdentityFile ~/.ssh/github_rsa
   User [email protected]

Ça s'est bien passé.

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

1
Jyoti Prakash

Une alternative éventuellement plus simple à l'édition 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 à ssh-agent en lançant:

ssh-add ~/.ssh/id_rsa_anotheraccount

Gardez à l'esprit que la commande ci-dessus ajoutera uniquement la clé à ssh-agent pour votre session actuelle. Si vous voulez que cela fonctionne pour toujours, vous devez l'ajouter "en permanence" à votre agent ssh. Par exemple, voici comment faire pour ubuntu et ici pour OSX .

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

0
jkukul