Le cas d'utilisation suivant est celui-ci: J'aimerais pouvoir utiliser Push to [email protected]:gitolite-admin
à l'aide de la clé privée de l'utilisateur gitolite-admin
, alors que je veux Push to [email protected]:some_repo
à l'aide de la clé privée 'ma propre'. Autant que je sache, je ne peux pas résoudre cela avec ~/.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 la définis dans ~/.ssh/config
pour [email protected]
. Est-ce que quelqu'un connaît un moyen de remplacer la clé utilisée pour une seule invocation git
?
(De plus, gitolite distingue qui pousse en fonction de la clé. Ainsi, en termes d'accès, de propriété et d'audit, la chaîne user @ server est identique pour différents utilisateurs.)
Même si l'utilisateur et l'hôte sont identiques, ils peuvent toujours être distingués dans ~/.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, vous utilisez simplement 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
Vous souhaitez inclure l'option IdentitiesOnly yes
pour empêcher l'utilisation d'identifiants par défaut. Sinon, si vous avez également des fichiers id correspondant aux noms par défaut, ils seront d'abord essayés car contrairement aux autres options de configuration (qui respectent "premier des victoires"), l'option IdentityFile
ajoute à la liste des identités à essayer. Voir: https://serverfault.com/questions/450796/how-could-i-stop-ssh-offering-a-wrong-key/450807#450807
Une approche alternative à la proposée plus haut par Mark Longair consiste à utiliser un alias qui exécutera la commande toute commande git, sur toute commande distante, avec une clé SSH alternative. L'idée est fondamentalement de changer votre identité SSH lors de l'exécution des commandes git.
Les avantages par rapport à l’alias d’hôte dans l’autre réponse:
remote
.J'utilise quelques petits scripts et un git alias admin
. De cette façon, je peux faire, par exemple:
git admin Push
Pousser vers la télécommande par défaut en utilisant 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 faire git 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, éventuellement définissez 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 commandes utilisant SSH, mais utilisant une clé SSH donnée plutôt que la valeur par défaut:
#!/bin/bash
exec ssh ${SSH_KEYFILE+-i "$SSH_KEYFILE"} "$@"
Étape 3: Créez un script appelé “git-as.sh” qui exécute les commandes git en utilisant la clé SSH donnée.
#!/bin/bash
SSH_KEYFILE=$1 GIT_SSH=${BASH_SOURCE%/*}/ssh-as.sh exec git "${@:2}"
Étape 4: Ajoutez un alias (en utilisant un nom approprié pour “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 sur: http://noamlewis.wordpress.com/2013/01/24/git-admin-an-alias-for-running-git-commands-as-a-privileged-ssh-identity/
Vous pouvez utiliser la variable d'environnement git GIT_SSH_COMMAND
. Exécutez ceci dans votre terminal sous votre dépôt git:
GIT_SSH_COMMAND='ssh -i ~/.ssh/your_private_key' git submodule update --init
Remplacez ~/.ssh/your_private_key
par le chemin de la clé privée ssh que vous voulez utiliser. Et vous pouvez changer la commande suivante de git (dans l'exemple, git submodule update --init
), par d'autres comme git pull
, git fetch
, etc.
Sur les systèmes 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 utilisez ssh
sans option -i
, il utilise la clé privée par défaut pour s’authentifier auprès du système distant.
Si vous voulez 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 dans votre$ HOME/.bash_profile:
ssh-add ~/.ssh/deploy_key
ssh-add ~/.ssh/id_rsa
Ainsi, chaque fois que vous utilisez ssh
ou git
ou scp
(en gros ssh
également), vous n’êtes plus obligé d’utiliser l’option -i
.
Vous pouvez ajouter autant de clés que vous le souhaitez dans le fichier$ HOME/.bash_profile.
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 travail/et un répertoire privé/qui finissent de manière transparente en utilisant différentes clés et identités avec ssh.
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:
Host your_Host.com
IdentityFile [absolute_path_to_your_.ssh]\id_rsa
Je suppose que l'hôte doit être une URL et pas simplement un "nom" ou une référence pour votre hôte. Par exemple,
Host github.com
IdentityFile c:/users/[user_name]/.ssh/id_rsa
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
Si vous utilisez la version ssh de Git sous Windows, la ligne du fichier d'identité dans la configuration ssh ressemble
IdentityFile /c/Users/Whoever/.ssh/id_rsa.alice
où /c
est pour c:
Pour vérifier, allez faire
cd ~/.ssh
pwd
À partir de git 2.10, il est également possible d'utiliser le paramètre gitconfig sshCommand. Etat de la documentation :
Si cette variable est définie, git fetch et git Push utiliseront la commande spécifiée au lieu de ssh lorsqu'ils devront se connecter à un système distant. La commande se présente sous la même forme que la variable d’environnement GIT_SSH_COMMAND et est remplacée lorsque la variable d’environnement est définie.
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 redéfinit la commande. Dans ce cas, essayez ssh -i ~/.ssh/[insert_your_keyname] -F /dev/null
pour ne pas utiliser ssh_config.
vous avez le plus spécifié dans la clé de configuration de fichier ssh:
# Default GitHub user
Host one
HostName gitlab.com
User git
PreferredAuthentications publickey
IdentityFile ~/.ssh/key-one
IdentitiesOnly yes
#two user
Host two
HostName gitlab.com
User git
PreferredAuthentications publickey
IdentityFile ~/.ssh/key-two
IdentitiesOnly yes