J'ai le cas d'utilisation suivant: je voudrais pouvoir pousser à [email protected]:gitolite-admin
utiliser la clé privée de l'utilisateur gitolite-admin
, tandis que je veux pousser à [email protected]:some_repo
utiliser «ma» clé privée. AFAIK, je ne peux pas résoudre ce problème en utilisant ~/.ssh/config
, car le nom d'utilisateur et le nom du serveur sont identiques dans les deux cas. Comme j'utilise principalement ma propre clé privée, je l'ai définie ~/.ssh/config
pour [email protected]
. Quelqu'un connaît-il un moyen de remplacer la clé utilisée pour une seule git
invocation?
(À part: gitolite distingue qui fait le push en fonction de la clé, donc ce n'est pas un problème, en termes d'accès, de propriété et d'audit, que la chaîne user @ server soit identique pour différents utilisateurs.)
Réponses:
Même si l'utilisateur et l'hôte sont identiques, ils peuvent toujours être distingués
~/.ssh/config
. Par exemple, si votre configuration ressemble à ceci:Ensuite, vous utilisez simplement
gitolite-as-alice
etgitolite-as-bob
au lieu du nom d'hôte dans votre URL:Remarque
Vous souhaitez inclure l'option
IdentitiesOnly yes
pour empêcher l'utilisation d'ID par défaut. Sinon, si vous avez également des fichiers id correspondant aux noms par défaut, ils seront essayés en premier car, contrairement aux autres options de configuration (qui respectent "first in wins"), l'IdentityFile
option s'ajoute à la liste des identités à essayer. Voir: /server/450796/how-could-i-stop-ssh-offering-a-wrong-key/450807#450807la source
git@
partie dans la télécommande n'est pas nécessaire car elle est indiquée dans laUser
ligne de la configuration.IdentitiesOnly yes
immédiatement après la ligne avecIdentityFile
pour l'hôte. Il semble qu'il transmettait plusieurs identités et l'une d'entre elles n'a pas pu accéder à l'hôte.Une approche alternative à celle proposée ci-dessus par Mark Longair consiste à utiliser un alias qui exécutera n'importe quelle commande git, sur n'importe quelle télécommande, avec une clé SSH alternative. L'idée est essentiellement de changer votre identité SSH lors de l'exécution des commandes git.
Avantages par rapport à l'approche d'alias d'hôte dans l'autre réponse:
remote
explicitement le.J'utilise quelques petits scripts et un alias git
admin
. De cette façon, je peux faire, par exemple:Pour pousser vers la télécommande par défaut à l'aide de la clé SSH alternative ("admin"). Encore une fois, vous pouvez utiliser n'importe quelle commande (pas seulement
push
) avec cet alias. Vous pourriez même fairegit admin clone ...
pour cloner un référentiel auquel vous n'auriez accès qu'en utilisant votre clé "admin".Étape 1: Créez les clés SSH alternatives, définissez éventuellement une phrase secrète au cas où vous le feriez sur la machine de quelqu'un d'autre.
Étape 2: Créez un script appelé «ssh-as.sh» qui exécute des éléments qui utilisent SSH, mais utilise une clé SSH donnée plutôt que la valeur par défaut:
Étape 3: Créez un script appelé «git-as.sh» qui exécute les commandes git en utilisant la clé SSH donnée.
Étape 4: Ajoutez un alias (en utilisant quelque chose de approprié pour «PATH_TO_SCRIPTS_DIR» ci-dessous):
Plus de détails sur: http://noamlewis.wordpress.com/2013/01/24/git-admin-an-alias-for-running-git-commands-as-a-privileged-ssh-identity/
la source
$@
->"$@"
pour être sûr.Vous pouvez utiliser la variable d'environnement git
GIT_SSH_COMMAND
. Exécutez ceci dans votre terminal sous votre référentiel git:Remplacez
~/.ssh/your_private_key
par le chemin de la clé privée ssh que vous souhaitez utiliser. Et vous pouvez modifier la commande git ultérieure (dans l'exemple estgit submodule update --init
) à d' autres commegit pull
,git fetch
, etc.la source
Un système basé sur Unix (Linux, BSD, Mac OS X), l'identité par défaut est stockée dans le répertoire $ HOME / .ssh , dans 2 fichiers:
private key: $HOME/.ssh/id_rsa public key: $HOME/.ssh/id_rsa.pub
lorsque vous utilisezssh
sans option-i
, il utilise la clé privée par défaut pour s'authentifier auprès du système distant.Si vous souhaitez utiliser une autre clé privée, par exemple $ HOME / .ssh / deploy_key , vous devez utiliser
ssh -i ~/.ssh/deploy_key ...
C'est ennuyant. Vous pouvez ajouter les lignes suivantes à votre $ HOME / .bash_profile :
ssh-add ~/.ssh/deploy_key ssh-add ~/.ssh/id_rsa
Ainsi, chaque fois que vous utilisez
ssh
ougit
ouscp
(en grosssh
aussi), vous n'avez plus besoin d'utiliser l'option-i
.Vous pouvez ajouter autant de clés que vous le souhaitez dans le fichier $ HOME / .bash_profile .
la source
Une autre alternative consiste à utiliser ssh-ident, pour gérer vos identités ssh .
Il charge et utilise automatiquement différentes clés en fonction de votre répertoire de travail actuel, des options ssh, etc. ... ce qui signifie que vous pouvez facilement avoir un répertoire work / et private / directory qui finit de manière transparente par utiliser différentes clés et identités avec ssh.
la source
J'utilise Git Bash sur Win7. Ce qui suit a fonctionné pour moi.
Créez un fichier de configuration dans ~ / .ssh / config ou c: / users / [votre_nom_utilisateur] /. Ssh / config. Dans le fichier, entrez:
Je suppose que l'hôte doit être une URL et pas seulement un "nom" ou une référence pour votre hôte. Par exemple,
Le chemin peut également être écrit au format / c / users / [nom_utilisateur] / ....
La solution fournie par Giordano Scalzo est également excellente. https://stackoverflow.com/a/9149518/1738546
la source
À partir de git 2.10, il est également possible d'utiliser le paramètre gitconfig sshCommand. Les documents indiquent :
Un exemple d'utilisation serait:
git config core.sshCommand "ssh -i ~/.ssh/[insert_your_keyname]
Dans certains cas, cela ne fonctionne pas car ssh_config écrase la commande, dans ce cas, essayez
ssh -i ~/.ssh/[insert_your_keyname] -F /dev/null
de ne pas utiliser ssh_config.la source
J'ai regroupé et testé avec github l'approche suivante, basée sur la lecture d'autres réponses, qui combine quelques techniques:
L'avantage de cette approche est qu'une fois configurée, elle ne nécessite aucun travail supplémentaire pour bien faire les choses - par exemple, vous n'avez pas besoin de modifier les URL distantes ou de ne pas oublier de cloner les choses différemment - la réécriture d'URL fait tout fonctionner .
~/.ssh/config
~/.gitconfig
~/dev/work/.gitconfig
Tant que vous gardez tous vos dépôts de travail sous ~ / dev / work et vos données personnelles ailleurs, git utilisera la bonne clé SSH lors des pulls / clones / pushs sur le serveur, et il joindra également l'adresse e-mail correcte à tous vos engagements.
Références:
1
2
la source
includeIf
ne devrait fonctionner que s'il y a un.git
répertoire que je pensais?Si vous utilisez la version de ssh de Git sur Windows, la ligne du fichier d'identité dans la configuration ssh ressemble à
où
/c
est pourc:
Pour vérifier, dans git's bash do
la source
Vous devrez peut-être supprimer (ou commenter) la configuration d'hôte par défaut
la source
vous avez le plus spécifié dans le fichier de configuration clé ssh:
la source
Comme quelqu'un d'autre l'a mentionné, la
core.sshCommand
configuration peut être utilisée pour remplacer la clé SSH et d'autres paramètres.Voici un exemple où vous avez une autre clé nommée
~/.ssh/workrsa
et que vous souhaitez utiliser pour tous les référentiels clonés~/work
..gitconfig
fichier sous~/work
:~/.gitconfig
, ajoutez:la source
Une possibilité d'utilisation
~/.ssh/config
consiste à utiliser laMatch
restriction au lieu de laHost
restriction. Appelle en particulierMatch Exec
une commande shell pour décider d'appliquer ou non les déclarations. En bash, vous pouvez utiliser la commande suivante:Cela utilise la
[
commande bash pour vérifier si deux chaînes sont égales. Dans ce cas, il teste si la chaîne[email protected]:gitolite-admin
correspond à la sortie obtenue à partir de la$(git config --get remote.origin.url)''
commande.Vous pouvez utiliser n'importe quelle autre commande qui identifie le référentiel sur lequel se trouve le shell. Pour que cela fonctionne, il est important d'avoir la
$SHELL
variable définie dans votre shell, dans mon cas/bin/bash
. L'exemple complet serait alors le suivant~/.ssh/config
:Dans cet exemple, j'ai supposé qu'il
~/.ssh/yourOwnPrivateKey
contient votre propre clé privée et que~/.ssh/gitolite-admin
contient la clé privée de l'utilisateurgitolite-admin
. J'ai inclus laIdentitiesOnly yes
déclaration pour m'assurer qu'une seule clé est offerte au serveur git, mentionnée par Mark Longair . Les autres déclarations ne sont que des options ssh standard pour git.Vous pouvez ajouter cette configuration si vous en avez plusieurs
some_repo
que vous souhaitez utiliser avec différentes clés. Si vous avez plusieurs référentiels sur[email protected]
et la plupart d'entre eux utilisent le,~/.ssh/yourOwnPrivateKey
il est plus logique d'inclure cette clé par défaut pour l'hôte. Dans ce cas, ce~/.ssh/config
serait:Notez que la commande est importante et que la
Host git.company.com
restriction doit apparaître aprèsMatch Exec
celle ou celles.la source
Configurez votre référentiel à l'aide de
git config
. Par exemple:la source