973 votes

Comment indiquer à git la clé privée à utiliser ?

ssh a le -i pour indiquer le fichier de clé privée à utiliser lors de l'authentification :

-i _identity_file_

Sélectionne un fichier à partir duquel l'identité (clé privée) pour l'authentification RSA ou DSA est lue. La valeur par défaut est ~/.ssh/identity pour le protocole version 1, et ~/.ssh/id_rsa y ~/.ssh/id_dsa pour le protocole version 2. Les fichiers d'identité peuvent également être spécifiés sur une base par hôte dans le fichier de configuration.  Il est possible d'avoir plusieurs -i options (et les identités multiples spécifiées dans les fichiers de configuration).

Y a-t-il un moyen similaire de dire git quel fichier de clé privée utiliser sur un système comportant plusieurs clés privées dans le fichier ~/.ssh répertoire ?

3 votes

2 votes

936voto

shellholic Points 10403

Sur ~/.ssh/config , ajoutez :

Host github.com
 HostName github.com
 IdentityFile ~/.ssh/id_rsa_github

Si le fichier de configuration est nouveau, vous devrez peut-être effectuer les opérations suivantes chmod 600 ~/.ssh/config

Maintenant, vous pouvez faire git clone git@github.com:{ORG_NAME}/{REPO_NAME}.git

  • Donde {ORG_NAME} est le nom de l'URI GitHub de votre compte d'utilisateur GitHub (ou du compte de votre organisation).
    • Notez qu'il y a un deux-points : après github.com au lieu de la barre oblique / - car il ne s'agit pas d'un URI.
  • Et {REPO_NAME} est le nom URI de votre repo GitHub.
  • Par exemple, pour le noyau Linux ce serait git clone git@github.com:torvalds/linux.git ).

REMARQUE : Sous Linux et macOS, vérifiez que les autorisations sur votre IdentityFile sont de 400. SSH rejettera, d'une manière peu explicite, les clés SSH qui sont trop lisibles. Cela ressemblera simplement à un rejet de créance. La solution, dans ce cas, est la suivante :

chmod 400 ~/.ssh/id_rsa_github

230 votes

Que faire si vous devez vous connecter au même hôte avec des clés différentes ?

0 votes

J'utilise cette astuce dans mon github-keygen que j'ai construit pour gérer les clés et les paramètres SSH pour Github.

1 votes

@Cliff Nop, dans ma page de manuel : " HostName : Spécifie le nom d'hôte réel auquel se connecter. Cela peut être utilisé pour spécifier des surnoms ou des abréviations pour les hôtes." Ma version de ssh est openssh-6.7p1.

617voto

Flimm Points 9047

Variable d'environnement GIT_SSH_COMMAND

À partir de la version 2.3.0 de Git, vous pouvez utiliser la variable d'environnement GIT_SSH_COMMAND comme ça :

GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example" git clone example

Notez que -i peut parfois être remplacée par votre fichier de configuration, auquel cas vous devez donner à SSH un fichier de configuration vide, comme ceci :

GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example -F /dev/null" git clone example

Configuration core.sshCommand

Depuis la version 2.10.0 de Git vous pouvez configurer cela par repo ou globalement, de sorte que vous n'avez plus besoin de définir la variable d'environnement, une fois que vous avez déjà cloné le repo :

git config core.sshCommand "ssh -i ~/.ssh/id_rsa_example -F /dev/null"
git pull
git push

5 votes

J'ai dû exporter le Shell à une variable d'environnement pour que cela fonctionne, à savoir export GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example" entonces git clone example

10 votes

@Abdull Dans Bash, l'affectation sur la même ligne que la commande exporte la variable d'environnement pour cette seule commande. Essayez-le : example=hello /usr/bin/env | grep example .

4 votes

Les choses se sont encore améliorées : à partir de Git 2.10, vous pouvez enregistrer la commande dans votre configuration Git : stackoverflow.com/a/38474220/520162

168voto

kenorb Points 22006

Il y a pas de direct chemin de dire git quelle clé privée utiliser, car il s'appuie sur ssh pour l'authentification du référentiel. Cependant, il existe encore quelques moyens d'atteindre votre objectif :

Option 1 : ssh-agent

Vous pouvez utiliser ssh-agent pour autoriser temporairement votre clé privée.

Par exemple :

$ ssh-agent sh -c 'ssh-add ~/.ssh/id_rsa; git fetch user@host'

Option 2 : GIT_SSH_COMMAND

Passez les arguments ssh en utilisant l'option GIT_SSH_COMMAND variable d'environnement (Git 2.3.0+).

Par exemple :

$ GIT_SSH_COMMAND='ssh -i ~/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' \
  git clone user@host

Vous pouvez taper tout cela sur une seule ligne - ignorez les éléments suivants <code>$</code> et laisser de côté le <code>\</code> .

Option 3 : GIT_SSH

Passez les arguments ssh en utilisant l'option GIT_SSH pour spécifier une autre variable d'environnement ssh binaire.

Par exemple :

$ echo 'ssh -i ~/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no $*' > ssh
$ chmod +x ssh
$ GIT_TRACE=1 GIT_SSH='./ssh' git clone user@host

Note : Les lignes ci-dessus sont des lignes de commande Shell (terminal) que vous devez coller dans votre terminal. Elles vont créer un fichier nommé <em><code>ssh</code></em> , le rendre exécutable, et (indirectement) l'exécuter.

Nota: GIT_SSH est disponible depuis la v0.99.4 (2005).

Option 4 : ~/.ssh/config

Utilisez le ~/.ssh/config comme suggéré dans d'autres réponses afin de spécifier l'emplacement de votre clé privée, par ex.

Host github.com
  User git
  Hostname github.com
  IdentityFile ~/.ssh/id_rsa

3 votes

// , Et si votre identité dans ssh-agent est transmise, comme dans cette question ? superuser.com/questions/971732/

1 votes

Je me suis permis de reformater ce post : IMO ceci est de loin la réponse la plus complète. Dans sa conception originale, un balayage rapide suggérait que le message décrivait une seule solution compliquée au problème, ce qui m'a échappé.

9 votes

$ ssh-agent sh -c 'ssh-add ~/.ssh/id_rsa; git fetch user@host' a fonctionné pour moi quand rien d'autre ne le faisait. Félicitations.

77voto

thucnguyen Points 839

Utiliser la configuration personnalisée de l'hôte dans ~/.ssh/config comme ceci :

Host gitlab-as-thuc  
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_rsa.thuc
    IdentitiesOnly yes

puis utilisez votre nom d'hôte personnalisé comme ceci :

git remote add thuc git@gitlab-as-thuc:your-repo.git

6 votes

C'est la réponse que je cherchais, car j'ai des comptes GitHub séparés pour la maison et le travail. J'ai juste eu à définir Host work.github.com HostName github.com IdentityFile ~/.ssh/work et remplacer "github.com" par "work.github.com" lorsque je clone un dépôt de travail. Il se connecte toujours à "github.com", mais en utilisant une paire de clés différente de celle par défaut.

1 votes

L'URL pour les détails (" itblog.study.land/..." ) ne fonctionne plus :(

0 votes

@CarlSmotricz l'original a été déplacé ici : medium.com/@thucnc/

49voto

nyxz Points 543

Si vous devez vous connecter au même hôte avec des clés différentes, vous pouvez le faire de la manière suivante :

  1. Configurer le ~/.ssh/config avec des hôtes différents mais des noms d'hôtes identiques.
  2. Clonez votre repo en utilisant l'hôte approprié.

Exemple :

~/.ssh/config

Host **work**
  HostName bitbucket.org
  IdentityFile ~/.ssh/**id\_rsa\_work**
  User git

Host **personal**
  HostName bitbucket.org
  IdentityFile ~/.ssh/**id\_rsa\_personal**
  User git

Entonces au lieu de cloner vos dépôts comme :

git clone git@**bitbucket.org**:username/my-work-project.git
git clone git@**bitbucket.org**:username/my-personal-project.git

vous devez faire

git clone git@**work**:username/my-work-project.git
git clone git@**personal**:username/my-personal-project.git

3 votes

Incroyable. Merci pour ça - ça a marché pour moi, et ça m'a semblé le plus direct.

0 votes

Ou juste git remote add origin git@personal:username/my-personal-project.git

1 votes

C'est la meilleure façon de procéder, surtout si vous utilisez des clés de déploiement dans Github.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X