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

Repos 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 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 [email protected]:accountnamedoivent utiliser id_rsaet [email protected]:anotheraccountdoivent utiliser id_rsa_anotheraccount.

radesix
la source
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

Jim Wrubel
la source
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 [email protected]: work / my_repo.git (as opposé à "[email protected] ...")
BobS
Cela fonctionne: superuser.com/questions/232373/…
Casey
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 "[email protected]"


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

Stefano
la source
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://[email protected]/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 "[email protected]"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://[email protected]/alice/repo1.git"

Pour repo2

[remote "origin"]
        url = "ssh://[email protected]/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.

Gubatron
la source
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.

Eric Wang
la source
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
Andy Lester
la source
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 ).

Jakub Kukul
la source
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
berniey
la source
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 [email protected].

Un bon tutoriel.

Ne plaisante pas avec les hôtes

I159
la source
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 [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.

Jyoti Prakash
la source
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 "[email protected]"

Puisque le id_rsa_workfichier n'existe pas dans le chemin ~/.ssh/, et je crée ce fichier manuellement, et cela ne fonctionne pas :(

li2
la source
2

J'ai posté la technique que j'utilise pour y faire face ici

David H
la source