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)
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.
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.
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.
Utilisez ssh-add path-to-private-key
cela fonctionne hors de la boîte.
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.
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 '