473 votes

Spécifier une clé SSH pour git push sans l'aide de ~/.ssh/config

J'ai la suite de cas d'utilisation: je voudrais être en mesure de pousser à l' git@git.company.com:gitolite-admin à l'aide de la clé privée de l'utilisateur gitolite-admin, tandis que je tiens à pousser à l' git@git.company.com:some_repo de l'utilisation de 'ma propre clé privée. Autant que je sache, je ne peux pas résoudre ce à l'aide d' ~/.ssh/config, parce que le nom d'utilisateur et le nom du serveur sont identiques dans les deux cas. Comme j'utilise principalement mon propre clé privée, j'ai que définie à l' ~/.ssh/config pour git@git.company.com. Personne ne sait d'une façon de remplacer la clé qui est utilisée pour un seul git invocation?

(Aparté: gitolite distingue qui est en train de faire le pousser fondé sur la clé, il n'est donc pas un problème, en termes d'accès, de propriété et de l'audit, que l'utilisateur@serveur de la chaîne est identique pour les différents utilisateurs.)

775voto

Mark Longair Points 93104

Même si l'utilisateur et l'hôte sont les mêmes, ils peuvent encore être distingués en ~/.ssh/config. Par exemple, si votre configuration ressemble à ceci:

Host gitolite-as-alice
  HostName git.company.com
  User git
  IdentityFile /home/whoever/.ssh/id_rsa.alice
  IdentitiesOnly yes

Host gitolite-as-bob
  HostName git.company.com
  User git
  IdentityFile /home/whoever/.ssh/id_dsa.bob
  IdentitiesOnly yes

Ensuite, il vous suffit d'utiliser gitolite-as-alice et gitolite-as-bob au lieu du nom d'hôte dans votre URL:

git remote add alice git@gitolite-as-alice:whatever.git
git remote add bob git@gitolite-as-bob:whatever.git

Note

Vous souhaitez inclure l'option IdentitiesOnly yes pour empêcher l'utilisation de noms par défaut. Sinon, si vous avez également des fichiers d'id de correspondance les noms par défaut, ils auront essayé d'abord parce que contrairement à d'autres options de configuration (qui respectent "le meilleur") IdentityFile option ajoute à la liste des identités d'essayer. Voir: http://serverfault.com/questions/450796/how-could-i-stop-ssh-offering-a-wrong-key/450807#450807

61voto

sinelaw Points 6641

Une approche alternative à celle proposée ci-dessus par Mark Longair est d'utiliser un alias qui va exécuter toute commande git, sur toute distance, avec une autre clé SSH. L'idée est fondamentalement changer votre SSH identité lors de l'exécution des commandes git.

Avantages par rapport à l'alias d'hôte approche dans l'autre réponse:

  • Va travailler avec toutes les commandes git ou alias, même si vous ne pouvez pas spécifier l' remote explicitement.
  • Plus facile de travailler avec beaucoup de dépôts, car vous avez seulement besoin de configurer une seule fois par client de la machine, pas une fois par dépôt sur chaque ordinateur client.

J'utilise quelques petits scripts et un git alias admin. De cette façon, je peux le faire, par exemple:

git admin push 

Pour le pousser à distance par défaut à l'aide de l'alternative ("admin") clé SSH. De nouveau, vous peut utiliser n'importe quelle commande (et pas seulement push) avec cet alias. Vous pourriez même faire git admin clone ... de cloner un dépôt que vous n'avez accès qu'à l'aide de votre "admin".

Étape 1: Créer l'alternative des clés SSH, le cas échéant, définir un mot de passe dans le cas où vous êtes en train de faire cela sur quelqu'un d'autre de la machine.

Étape 2: Créer un script appelé "ssh-as.sh" qui exécute des trucs qui utilise le protocole SSH, mais utilise une clé SSH plutôt que celui par défaut:

#!/bin/bash
set -e
set -u

ssh -i $SSH_KEYFILE $@

Étape 3: Créer un script appelé "git-as.sh" qui exécute les commandes git à l'aide de la clé SSH.

#!/bin/bash
set -e
set -u

SSH_KEYFILE_NAME=$1
SCRIPTS_DIR=$(dirname $0)
shift

SSH_KEYFILE=$SSH_KEYFILE_NAME GIT_SSH=$SCRIPTS_DIR/ssh-as.sh git $@

Étape 4: Ajouter un alias (à l'aide de quelque chose de convenable "PATH_TO_SCRIPTS_DIR" ci-dessous):

# Run git commands as the SSH identity provided by the keyfile ~/.ssh/admin
git config --global alias.admin \!"PATH_TO_SCRIPTS_DIR/git-as.sh ~/.ssh/admin"

Plus de détails au: http://noamlewis.wordpress.com/2013/01/24/git-admin-an-alias-for-running-git-commands-as-a-privileged-ssh-identity/

10voto

rabexc Points 111

Une autre alternative est d'utiliser ssh-ident, à gérer votre ssh identités.

Il charge automatiquement et utilise des clés différentes en fonction de votre répertoire de travail courant, ssh options, et ainsi de suite... ce qui signifie que vous pouvez facilement avoir un travail/ répertoire privé et/ répertoire de manière transparente fin vers le haut en utilisant différentes touches et les identités avec ssh.

9voto

user1738546 Points 1

Je suis à l'aide de Git Bash sur Win7. La suite travaillé pour moi.

Créer un fichier de configuration dans ~/.ssh/config ou c:/users/[your_user_name]/.ssh/config. Dans le fichier d'entrée:

Host your_host.com
     IdentityFile [absolute_path_to_your_.ssh]\id_rsa

Je suppose que l'hôte doit être une URL, et pas seulement un "nom" ou ref pour votre hôte. Par exemple,

Host github.com
     IdentityFile c:/users/[user_name]/.ssh/id_rsa

Le chemin d'accès peut aussi être écrit en /c/utilisateurs/[nom_utilisateur]/.... format

La solution fournie par Giordano Scalzo est trop grand. http://stackoverflow.com/a/9149518/1738546

5voto

Andrew Murphy Points 43

Si vous utilisez Git version de ssh sous windows, le fichier d'identité de la ligne dans la config ssh ressemble

IdentityFile /c/Users/Whoever/.ssh/id_rsa.alice

/c est c:

Pour le vérifier, dans le git de bash n'

cd ~/.ssh
pwd 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X