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
.
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
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! :)
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.
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.
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.
J'ai 2 comptes sur github, et voici ce que j'ai fait (sur linux
) pour le faire fonctionner.
ssh-keygen
, nommez-les correctement pour faciliter la vie.ssh-add path_to_private_key
~/.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:
github-kc
: git remote set-url Origin git@github-kc:kuchaguangjie/pygtrans.git
github-abc
: git remote set-url Origin git@github-abc:abcdefg/yyy.git
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
.
Host
]Hostname
github.com
pour github,User
git git
pour github,IdentityFile
LogLevel
DEBUG3
donne les informations les plus détaillées.Utilisez le paramètre IdentityFile
dans votre ~/.ssh/config
:
Host github.com
HostName github.com
IdentityFile ~/.ssh/github.rsa
User petdance
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:
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
Transférez keyfile.pub
chez le fournisseur git
ps -ef | grep ssh-agent
pour voir s'il fonctionne déjà)ssh-add .\keyfile
pour ajouter des informations d'identificationgit clone git@provider:username/project.git
J'ai passé beaucoup de temps à comprendre toutes les étapes. Décrivons donc étape par étape:
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.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.
ssh-add ~/.ssh/proj1.id_rsa
proj1.github.com
(exactement l'hôte du fichier de configuration) .git clone [email protected]
.Ne vous trompez pas avec les hôtes
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
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 :(
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.
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 ).