web-dev-qa-db-fra.com

GIT sélectionnez clé privée à utiliser

J'ai 2 serveurs Git qui nécessitent 2 clés SSH différentes.

git clone user1@server1:blahblahblah utilise ~/.ssh/id_rsa, mais je dois spécifier la clé à utiliser en fonction du serveur auquel je me connecte.

Quel paramètre de ligne de commande Git effectue ce travail? (Je suis sous Linux)

39
user349302

Si vous vous connectez via SSH, la clé sera contrôlée par un paramètre SSH et non par un paramètre git.

SSH recherche dans le fichier ~/.ssh/config les paramètres de configuration. Modifiez ce fichier et ajoutez les entrées IdentityFile pour les deux serveurs Git comme ceci:

Host server1.whatever.com
  IdentityFile /path/to/key_1
Host server2.whatever.com
  IdentityFile /path/to/key_2

Cet article a quelques détails supplémentaires.

21
Cameron Skinner

Il y a une autre possibilité. C'est pour définir core.sshCommand, par exemple.

git config --local core.sshCommand "/usr/bin/ssh -i /home/me/.ssh/id_rsa_foo"

Il existe un scénario particulier lorsque cette stratégie est particulièrement utile: lorsque vous avez plusieurs comptes sur Github, tous les comptes ssh sont associés à Github en tant que [email protected] et la clé ssh permet de déterminer quel utilisateur Github vous êtes. Dans ce cas, ni .ssh/config ni ssh-agent ne feront ce que vous voulez. 

Update - Vous ne pouvez pas exécuter ce qui précède tant que vous n'avez pas de référentiel local. Par conséquent, si vous essayez de cloner un référentiel distant, vous devez spécifier la clé manuellement, conformément à la réponse de Guss:

GIT_SSH_COMMAND="/usr/bin/ssh -i /home/me/.ssh/id_rsa_foo" git clone https://github.com/user/repo

Une fois que vous avez cloné le référentiel, vous pouvez utiliser la commande git config pour le définir de manière permanente.

27
Richard Smith

Généralement, vous souhaitez utiliser ~/.ssh/config pour cela. Associez simplement les adresses de serveur aux clés que vous souhaitez utiliser pour elles comme suit:

Host github.com
  IdentityFile ~/.ssh/id_rsa.github
Host heroku.com
  IdentityFile ~/.ssh/id_rsa.heroku
Host *
  IdentityFile ~/.ssh/id_rsa

Host * désigne n'importe quel serveur, je l'utilise donc pour définir ~/.ssh/id_rsa comme clé par défaut à utiliser.

27
Zaz

Utilisez ssh-add path-to-private-key cela fonctionne hors de la boîte.

14
khelll

Dans mon scénario, similaire au scénario @ Richard Smith (dont la solution, BTW, n'a pas fonctionné pour moi), je dois utiliser différentes clés pour le même serveur sous différents référentiels.

La solution pour moi consistait à configurer la session correctement avec la variable d'environnement GIT_SSH_COMMAND, comme suit:

export GIT_SSH_COMMAND="ssh -o IdentitiesOnly=yes -i ~/.ssh/my-secret-identitiy"

Mettre à jour :

Une autre chose à noter ici est que la définition correcte de la variable d'environnement peut être une tâche ardue. C'est pourquoi j'utilise la fonction de modification rapide des commandes fournie par des éléments tels que Liquid Prompt de Fish Shell pour se connecter à Shell et continuer à mettre à jour les variables d'environnement conformément au répertoire courant et quelques règles. Par exemple, tous mes projets personnels ayant besoin de ma clé SSH personnelle avec Gitlab sont sous ~/Documents/Projects/personal. Ainsi, lorsque le hook Shell exécute pwd et trouve que le répertoire en cours se trouve sous ce chemin, il définit automatiquement les variables GIT_SSH_COMMAND en fonction des besoins.

13
Guss

pour la première fois (clone), vous pouvez définir --global, après le clonage, vous pouvez définir --global ou --local, si la clé est définie par projet, je choisirais --local.

git config --local --add core.sshCommand 'ssh -i ~/.ssh/my_key '

0
Maoz Zadok