Plusieurs comptes GitHub et configuration SSH


249

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

Repos accessibles à partir d'un seul compte en utilisant git@github.com:accountname

Repos accessibles depuis un autre compte en utilisant 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 pense pas que le fichier de configuration soit correct cependant. Je ne sais pas trop comment spécifier que les dépôts accédés en utilisant git@github.com:accountnamedoivent utiliser id_rsaet git@github.com:anotheraccountdoivent utiliser id_rsa_anotheraccount.


J'ai trouvé ce lien utile medium.freecodecamp.org/…
jgreen

J'ai 3 identités SSH distinctes dans ~ / .ssh / config. Celui pour le serveur scolaire a un mot de passe; les 2 pour les comptes GitHub de travail / personnels séparés ne le font pas. L'exécution git pullcontinuait à échouer et à demander le mot de passe de l'école, malgré des fichiers d'identité distincts, "IdentitiesOnly = yes", des domaines et des noms d'hôtes distincts, tous présents dans ssh-add -l... La clé uni était "la première" quelle que soit cette configuration. J'ai dû déplacer sa section en dessous des autres dans .ssh / config, et maintenant à git pullpartir des deux comptes GitHub réussit sans demander le mot de passe uni ssh.
mc01

Réponses:


309

La réponse d'Andy Lester est exacte mais j'ai trouvé une étape supplémentaire importante que je devais faire pour que cela fonctionne. En essayant de mettre en place deux profils, un pour le personnel et un pour le travail, j'ai ~/.ssh/configété à 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 professionnel n'a pas pris jusqu'à ce que j'aie fait un ssh-add ~/.ssh/work_rsa. Après cela, les connexions à github ont utilisé le profil correct. Auparavant, ils utilisaient par défaut la première clé publique.

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


39
Merci! - ssh-addc'est ce qui me manquait.
sauge

En utilisant ssh-add, j'ai pu voir que je n'avais pas les autorisations de fichier pour le jeu de clés correctement. Une fois que j'ai corrigé que tout fonctionnait. Donc merci!
phatmann

6
Voir aussi doblock.com/articles/… . La nouvelle information clé est que vous devrez peut-être ajouter le nom d'utilisateur ("work", dans cet exemple) au nom d'hôte dans l'URL distante, c'est-à-dire git@work.github.com: work / my_repo.git (as opposé à "git@github.com ...")
BobS


15
Pour résoudre le problème «qu'ils ont par défaut la première clé publique», ajoutez IdentitiesOnly yesà la Host *section de votre ~/.ssh/configfichier. Cela indique à ssh d'utiliser réellement les fichiers d'identité que vous spécifiez, plutôt que de spammer le serveur avec tous.
Escargot mécanique

172

J'ai récemment dû le faire et j'ai dû passer au crible toutes ces réponses et leurs commentaires pour finalement rassembler les informations, donc je vais tout mettre ici, dans un seul message, pour votre commodité:


Étape 1: touches ssh
Créez les paires de clés 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"


Étape 2: configuration ssh
Configurez plusieurs profils ssh en créant / modifiant ~ / .ssh / config . Notez les valeurs légèrement différentes de l'hôte:

# 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 digitales 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à, lancez:

ssh-add ~/.ssh/id_rsa_work


Étape 4: test
Pour tester que vous avez tout fait 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! :)


1
Ceci est une excellente réponse. J'ai dû utiliser ssh-add pour ajouter les deux clés ssh pour utiliser le fichier de configuration .. Merci :)
gaurav.singharoy

La seule chose que j'aime ajouter est que lorsque vous exécutez ssh-keygen -t rsa, il vous donnera un nom de fichier par défaut, c'est là que vous entrez votre nom de fichier personnalisé.
Donato

Une des meilleures réponses. Cette vidéo m'a également aidé. youtube.com/watch?v=fnSRBRiQIU8&feature=youtu.be
TestingWithArif

Bon article, ce serait bien si cet article incluait la configuration de votre 'e-mail' de configuration git: help.github.com/articles/…
Dave Engineer

43

Disons que alicec'est un utilisateur de github.com, avec 2 référentiels privés ou plus repoN. Pour cet exemple, nous travaillerons avec seulement deux référentiels nommés repo1etrepo2

https://github.com/alice/repo1

https://github.com/alice/repo2

Vous devez être de tirer de ces référentiels sans entrer un mot de passe probablement sur un serveur ou sur plusieurs serveurs. Vous voulez effectuer git pull origin masterpar 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) ~/.ssh/configun fichier qui permet à votre client ssh de savoir quelle clé privée utiliser en fonction du nom d'hôte et du nom d'utilisateur, avec une simple entrée de configuration qui ressemble à ce:

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

Donc, vous êtes allé de l'avant et avez créé votre (alice_github.id_rsa, alice_github.id_rsa.pub)paire de clés, vous êtes également allé dans le .git/configfichier de votre référentiel et vous avez modifié l'URL de votre télécommande originpour qu'elle ressemble à ceci:

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

Et enfin, vous êtes allé à la Settings > Deploy keyssection du référentiel et ajouté le contenu dealice_github.id_rsa.pub

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

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

Donc, votre instinct sera de récupérer cette clé et de l'ajouter aux repo2clés de déploiement, 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 "alice@alice.com"sans mot de passe bien sûr), et pour que cela ne devienne pas un gâchis, vous allez maintenant nommer vos clés comme ceci:

  • repo1 paire de clés: (repo1.alice_github.id_rsa, repo1.alice_github.id_rsa.pub)
  • repo2 paire de clés: (repo2.alice_github.id_rsa, repo2.alice_github.id_rsa.pub)

Vous allez maintenant mettre la nouvelle clé publique sur repo2la configuration des clés de déploiement sur github.com, mais vous avez maintenant un problème ssh à résoudre.

Comment ssh peut-il dire quelle clé utiliser si les référentiels sont hébergés sur le même github.comdomaine?

Votre .ssh/configfichier pointe vers github.comet il ne sait pas quelle clé utiliser quand il est temps de faire le pull.

J'ai donc trouvé un truc avec github.com. Vous pouvez dire à votre client ssh que chaque référentiel vit dans un sous-domaine github.com différent, dans ces cas, ils seront repo1.github.cometrepo2.github.com

Donc, la première chose est de modifier les .git/configfichiers sur vos clones de référentiel, ils ressemblent donc à 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 .ssh/configfichier, vous allez maintenant pouvoir 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 désormais le faire git pull origin mastersans saisir de mot de passe à partir 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 repo. Vous aurez beaucoup plus de clés à manipuler, mais vous serez moins vulnérable si vous êtes compromis.


1
Spécifier le sous-domaine qui correspond à l'hôte .ssh/configest l'étape cruciale - merci beaucoup pour cela
Mike Miller

22

J'ai 2 comptes sur github, et voici ce que j'ai fait linuxpour le faire fonctionner.

Clés

  • Créez 2 paires de clés rsa, via ssh-keygen, nommez-les correctement, afin de vous 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 à distance pour le dépôt:

  • 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 en ~/.ssh/config:

  • Hostgithub- <identify_specific_user> L'
    hôte peut ê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-kcidentifier un de mes comptes sur github pour mon ordinateur portable local,

    Lorsque vous définissez l'URL à distance pour un dépôt git, c'est la valeur à mettre après git@, c'est ainsi qu'un repo est mappé à un hôte, par exemplegit 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.compour github,
  • Usergit
    l'utilisateur est toujours gitpour github,
  • IdentityFile
    spécifier la clé à utiliser, il suffit de mettre le chemin d'accès d'une clé publique,
  • LogLevel
    spécifiez le niveau de journal à déboguer, le cas échéant, DEBUG3donne les informations les plus détaillées.


charmant - n'a pas eu besoin ssh-add path_to_private_key- probablement parce que l'agent n'est pas requis dans ce cas. Le fichier de configuration définit explicitement le chemin d'accès aux clés.
Mark Chackerian

2
@MarkChackerian Je pense que vous n'en avez pas besoin ssh-addcar vos clés ne sont pas protégées par mot de passe ou (si vous êtes sur un Mac) le trousseau OSX le gère pour vous.ssh-addvous évite d'avoir à saisir la phrase secrète à chaque fois que vous accédez à vos clés.
Ashhar Hasan

18

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

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

Merci mais ce n'est pas tout à fait exact. J'ai trouvé la réponse et partagé ci-dessous.
radesix

Je suis sûr que mon approche fonctionnera dans votre cas. Vous pouvez identifier différents utilisateurs et différents fichiers d'identité. Il suffit de donner à chacun un paramètre Host différent dans la strophe de configuration.
Andy Lester

1
Andy, selon le lien que j'ai trouvé ci-dessous, j'avais besoin de supprimer le .com de l'hôte. Une fois que j'ai fait ça, ça a bien fonctionné.
radesix

5

Une alternative peut-être 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, non par défaut).

Dans le référentiel pour lequel vous souhaitez utiliser une autre clé, 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 n'ajoutera que la clé à l'agent ssh pour votre session en cours. Si vous voulez que cela fonctionne pour toujours, vous devez l'ajouter "en permanence" à votre agent ssh. Par exemple, voici comment le faire pour Ubuntu et ici pour OSX .

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


4

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

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

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

  2. Télécharger keyfile.pub vers le fournisseur git

  3. Démarrez ssh-agent sur votre machine (vous pouvez vérifier avec ps -ef | grep ssh-agent si elle fonctionne déjà)
  4. Courir ssh-add .\keyfile pour ajouter des informations d'identification
  5. Vous pouvez maintenant exécuter git clone git@provider:username/project.git

4

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_rsaet frappez sans aucun doute parce que vous n'avez pas besoin d'une 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
    

Tenez compte de la première section et notez que proj1.github.comnous reviendrons à la section plus tard.

  1. Ajouter l'identité à l'agent ssh ssh-add ~/.ssh/proj1.id_rsa
  2. C'est ce que j'ai foiré la première fois - maintenant, quand vous voulez cloner un dépôt 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 plaisante pas avec les hôtes


Merci pour le lien vers le turorial! Vous avez une faute de frappe: les noms des clés id_rsa_proj1et proj1_id_rsadevraient en fait être les mêmes. Vous pouvez également ajouter la partie sur les .git/configparamètres du didacticiel à votre réponse.
Cezar

Vous avez encore une faute de frappe: proj1.id_rsavsproj1_id_rsa
cezar

2

J'ai utilisé,

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

Ç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.


2

En complément de la réponse de @stefano, il est préférable d'utiliser la commande avec -flors 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 id_rsa_workfichier n'existe pas dans le chemin ~/.ssh/, et je crée ce fichier manuellement, et cela ne fonctionne pas :(


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.