Spécifiez la clé privée SSH-key à utiliser lors de l'exécution de la commande shell?

une situation assez inhabituelle peut-être, mais je veux spécifier une clé SSH privée à utiliser lors de l'exécution d'une commande shell (git) à partir de l'ordinateur local.

en gros comme ceci:

git clone git@github.com:TheUser/TheProject.git -key "/home/christoffer/ssh_keys/theuser"

ou même mieux (en rubis):

with_key("/home/christoffer/ssh_keys/theuser") do
  sh("git clone git@github.com:TheUser/TheProject.git")
end

j'ai vu des exemples de connexion à un serveur distant avec Net::SSH qui utilise une clé privée spécifiée, mais c'est une commande locale. Est-il possible?

743
demandé sur mikemaccana 2010-12-30 22:42:01

18 réponses

quelque chose comme ceci devrait fonctionner (suggéré par orip):

ssh-agent bash -c 'ssh-add /somewhere/yourkey; git clone git@github.com:user/project.git'

si vous préférez subshells, vous pouvez essayer ce qui suit (bien qu'il soit plus fragile):

ssh-agent $(ssh-add /somewhere/yourkey; git clone git@github.com:user/project.git)

Git va invoquer SSH qui va trouver son agent par variable d'environnement, ce qui, à son tour, aura la clé chargée.

alternativement, définir HOME peut aussi faire l'affaire, à condition que vous soyez prêt à configurer un répertoire qui ne contient qu'un .ssh répertoire comme HOME ; cela peut contenir une identité.pub, ou un fichier de configuration réglage de IdentityFile.

551
répondu Martin v. Löwis 2016-11-22 20:42:26

Aucune de ces solutions n'a fonctionné pour moi.

au lieu de cela, je développe sur @Martin v. Löwis la mention de la mise en place d'un config dossier pour SSH.

SSH recherchera le fichier ~/.ssh/config de l'utilisateur. J'ai la configuration suivante:

Host gitserv
    Hostname remote.server.com
    IdentityFile ~/.ssh/id_rsa.github
    IdentitiesOnly yes # see NOTES below

et j'ajoute un dépôt Git distant:

git remote add origin git@gitserv:myrepo.git

et puis les commandes git fonctionnent normalement pour moi.

git push -v origin master

NOTES

  • le IdentitiesOnly yes est requis pour empêcher le comportement par défaut ssh d'envoyer le fichier d'identité correspondant au nom de fichier par défaut pour chaque protocole. Si vous avez un fichier nommé ~/.ssh/id_rsa qui sera essayé avant votre ~/.ssh/id_rsa.github sans cette option.

Références

903
répondu HeyWatchThis 2018-02-02 13:43:09

les suggestions des autres sur ~/.ssh/config sont très compliquées. Il peut être aussi simple que:

Host github.com
  IdentityFile ~/.ssh/github_rsa
352
répondu philfreo 2016-08-05 17:24:14

à partir de git 2.3.0 nous avons aussi la commande simple (pas de fichier de configuration nécessaire):

GIT_SSH_COMMAND='ssh -i private_key_file' git clone user@host:repo.git

vous pourriez avoir besoin d'un redémarrage pour le service ssh sur votre machine.

252
répondu Robert Jack Will 2018-09-25 09:19:10

contenu de my_git_ssh_wrapper:

#!/bin/bash

ssh -i /path/to/ssh/secret/key  

, Alors vous pouvez utiliser la clé en faisant:

GIT_SSH=my_git_ssh_wrapper git clone git@github.com:TheUser/TheProject.git
124
répondu Joe Block 2012-02-17 01:32:57

pour résumer les réponses et commente , la meilleure façon de configurer git pour utiliser des fichiers clés différents et puis oublier, qui prend également en charge différents utilisateurs pour le même hôte (par exemple un compte GitHub personnel et un compte de travail), qui fonctionne sur Windows aussi bien, est d'éditer ~/.ssh/config (ou c:\Users\<your user>\.ssh\config ) et de spécifier des identités multiples:

Host github.com
HostName github.com
IdentityFile /path/to/your/personal/github/private/key
User dandv

Host github-work
HostName github.com
IdentityFile /path/to/your/work/github/private/key
User workuser

ensuite, pour cloner un projet en tant qu'utilisateur personnel, lancez simplement la commande régulière git clone .

pour cloner la pension comme workuser , Lancez git clone git@github-work:company/project.git .

77
répondu Dan Dascalescu 2017-11-13 08:59:26

Avec git 2.10+ (Q3 2016: publié Sept. 2d, 2016), vous avez la possibilité de définir un config pour GIT_SSH_COMMAND (et pas seulement une variable d'environnement comme décrit dans Rober Prise 's réponse )

See commit 3c8ede3 (26 Jun 2016) by Nguyփn Thái Ngփc Duy ( pclouds ) .

(fusionné par Junio CA Hamano -- gitster -- in commit dc21164 , 19 Jul 2016)

une nouvelle variable de configuration core.sshCommand a été ajoutée spécifiez la valeur de GIT_SSH_COMMAND à utiliser par dépôt.

core.sshCommand:

si cette variable est définie, git fetch et git push utiliseront la commande spécifiée au lieu de ssh quand ils ont besoin de se connecter à un système distant.

La commande est dans la même forme que la variable d'environnement GIT_SSH_COMMAND et est annulée lorsque la variable d'environnement est définie.

cela signifie que le git clone peut être:

cd /path/to/my/repo
git config core.sshCommand 'ssh -i private_key_file' 
# later on
git clone host:repo.git
50
répondu VonC 2017-05-23 12:26:34

comme indiqué ici: https://superuser.com/a/912281/607049

vous pouvez le configurer per-repo:

git config core.sshCommand "ssh -i ~/.ssh/id_rsa_example -F /dev/null"
git pull
git push
43
répondu David 2017-03-20 10:18:19

meilleure idée d'ajouter cet hôte ou ip au fichier .ssh/config comme suit:

Host (a space separated list of made up aliases you want to use for the host)
    User git
    Hostname (ip or hostname of git server)
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_(the key you want for this repo)
28
répondu thamster 2013-01-31 12:23:10

j'ai utilisé la variable D'environnement GIT_SSH. Voici mon emballage, similaire à celui de Joe Block d'en haut, mais gère n'importe quelle quantité d'arguments.

fichier ~/gitwrap.sh

#!/bin/bash
ssh -i ~/.ssh/gitkey_rsa "$@"

alors, dans mon .bashrc, ajouter le texte suivant:

export GIT_SSH=~/gitwrap.sh
28
répondu Jamie 2015-11-05 17:44:10

quand vous avez besoin de vous connecter à github avec une requête normale ( git pull origin master ), paramétrant L'hôte comme * dans ~/.ssh/config a fonctionné pour moi, tout autre hôte (dire," github "ou" gb") ne fonctionnait pas.

Host *
    User git
    Hostname github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_xxx
7
répondu chopstik 2013-05-06 04:34:54

beaucoup de ces solutions semblaient séduisantes. Cependant, j'ai trouvé l'approche générique git-wrapping-script au lien suivant comme étant la plus utile:

comment spécifier un fichier de clé ssh avec la commande git

le point étant qu'il n'y a pas de git commande telle que la suivante:

git -i ~/.ssh/thatuserkey.pem clone thatuser@myserver.com:/git/repo.git

la solution D'Alvin est d'utiliser un script bash-wrapper bien défini qui comble cette lacune:

git.sh -i ~/.ssh/thatuserkey.pem clone thatuser@myserver.com:/git/repo.git

git.sh est:

#!/bin/bash

# The MIT License (MIT)
# Copyright (c) 2013 Alvin Abad
# https://alvinabad.wordpress.com/2013/03/23/how-to-specify-an-ssh-key-file-with-the-git-command

if [ $# -eq 0 ]; then
    echo "Git wrapper script that can specify an ssh-key file
Usage:
    git.sh -i ssh-key-file git-command
    "
    exit 1
fi

# remove temporary file on exit
trap 'rm -f /tmp/.git_ssh.$$' 0

if [ "" = "-i" ]; then
    SSH_KEY=; shift; shift
    echo "ssh -i $SSH_KEY $@" > /tmp/.git_ssh.$$
    chmod +x /tmp/.git_ssh.$$
    export GIT_SSH=/tmp/.git_ssh.$$
fi

# in case the git command is repeated
[ "" = "git" ] && shift

# Run the git command
git "$@"

je peux vérifier que cela a résolu un problème que j'avais avec l'utilisateur/reconnaissance de clé pour un Bitbucket repo à distance avec git remote update , git pull , et git clone ; tout ce qui fonctionne maintenant très bien dans un script de travail cron qui avait autrement des difficultés à naviguer dans le shell limité. J'ai aussi pu appeler ce script de L'intérieur de R et toujours résoudre le même cron exécuter le problème (par exemple system("bash git.sh -i ~/.ssh/thatuserkey.pem pull") ).

non pas que R soit le même que Ruby, mais si R peut le faire... O: -)

7
répondu Paul McMurdie 2015-02-21 00:05:24

vous pouvez utiliser la variable D'environnement GIT_SSH. Mais vous aurez besoin d'envelopper ssh et options dans un script shell.

Voir git manuel: man git dans votre shell de commande.

3
répondu rudimeier 2014-02-19 11:59:47

le truc pour moi était d'utiliser git@hostname au lieu de http://hostname

2
répondu AmazingTurtle 2016-03-12 14:43:25

dans Windows avec Git Bash vous pouvez utiliser ce qui suit pour ajouter un dépôt ssh-agent bash -c 'ssh-add "key-address"; git remote add origin "rep-address"' par exemple: ssh-agent bash -c 'ssh-add /d/test/PrivateKey.ppk; git remote add origin git@git.test.com:test/test.git' quelle clé privée est dans le lecteur D, essai de dossier de l'ordinateur. Aussi, si vous voulez cloner un dépôt, vous pouvez changer git remote add origin avec git clone .

après entrer ceci à Git Bash, il vous demandera passphrase!

soyez conscient que les clés privées openssh et putty sont diiferentes!

si vous avez créé vos clés avec puttygen, vous devez convertir votre clé privée pour openssh!

2
répondu Peyman Mahdavi 2016-12-25 22:32:17

j'utilise zsh et différentes clés sont chargées automatiquement dans le ssh-agent de mon shell zsh à d'autres fins (c'est-à-dire l'accès à des serveurs distants) sur mon ordinateur portable. J'ai modifié la réponse de @Nick et je l'utilise pour une de mes repos qui doit être rafraîchie souvent. (Dans ce cas, c'est mon dotfiles que je veux la même et la dernière version sur toutes mes machines, où que je travaille.)

bash -c 'eval `ssh-agent`; ssh-add /home/myname/.dotfiles/gitread; ssh-add -L; cd /home/myname/.dotfiles && git pull; kill $SSH_AGENT_PID'
  • Frayer un ssh-agent
  • ajouter clé de lecture seule pour l'agent
  • changer l'annuaire à mon git repo
  • Si cd des pensions de dir est réussie, tirez de la télécommande du repo
  • Tuer donné naissance à ssh-agent. (Je ne voudrais pas que beaucoup d'agents s'attardent.)
0
répondu sdkks 2017-08-21 03:15:40

pour le gitlab RSAAuthentication yes

Host gitlab.com
  RSAAuthentication yes
  IdentityFile ~/.ssh/your_private_key_name
  IdentitiesOnly yes

doc est ici

0
répondu Alupotha 2017-09-02 00:07:35

si le numéro de port SSH n'est pas 22(par défaut), ajouter Port xx dans ~/.ssh/config

dans mon cas (synologie),

Host my_synology
    Hostname xxxx.synology.me
    IdentityFile ~/.ssh/id_rsa_xxxx
    User myname
    Port xx

puis cloner en utilisant le titre de L'hôte dans la configuration. ("my_synology". pour éviter @chopstik 's"*")

git clone my_synology:path/to/repo.git
0
répondu w..k 2017-10-31 15:25:44