web-dev-qa-db-fra.com

Spécifier une clé SSH pour git Push pour un domaine donné

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.)

302
Confusion

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

Remarque

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 IdentityFileajoute à la liste des identités à essayer. Voir: https://serverfault.com/questions/450796/how-could-i-stop-ssh-offering-a-wrong-key/450807#450807

535
Mark Longair

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:

  • Fonctionnera avec toutes les commandes git ou alias, même si vous ne pouvez pas spécifier explicitement remote.
  • Il est plus facile de travailler avec de nombreux référentiels car vous ne devez le configurer qu'une seule fois par ordinateur client, pas une seule fois par référentiel sur chaque ordinateur client.

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/

54
sinelaw

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.

31
Hustlion

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.

11

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.

10
rabexc

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

8
user1738546

Vous devrez peut-être supprimer (ou commenter) la configuration d'hôte par défaut  .ssh/config

3
ViliusK

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

/c est pour c:

Pour vérifier, allez faire

cd ~/.ssh
pwd 
3
Andrew Murphy

À 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.

1
firfin

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