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?
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.
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
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
à 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.
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
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
.
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
etgit push
utiliseront la commande spécifiée au lieu dessh
quand ils ont besoin de se connecter à un système distant.
La commande est dans la même forme que la variable d'environnementGIT_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
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
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)
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
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
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
où 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: -)
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.
le truc pour moi était d'utiliser git@hostname au lieu de http://hostname
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!
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.)
pour le gitlab RSAAuthentication yes
Host gitlab.com
RSAAuthentication yes
IdentityFile ~/.ssh/your_private_key_name
IdentitiesOnly yes
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