O situație destul de neobișnuită poate, dar vreau să specificați un privat SSH-cheie pentru a utiliza atunci când execută un shell (git) comanda de pe computerul local.
Practic astfel:
git clone [email protected]:TheUser/TheProject.git -key "/home/christoffer/ssh_keys/theuser"
Sau chiar mai bine (în Ruby):
with_key("/home/christoffer/ssh_keys/theuser") do
sh("git clone [email protected]:TheUser/TheProject.git")
end
Am văzut exemple de conectarea la un server de la distanță cu Net::SSH care folosește o anumită cheie privată, dar acest lucru este un local de comandă. Este posibil?
Niciuna dintre aceste soluții nu a lucrat pentru mine.
În schimb, am elaborat pe @Martin v. Löwis 's mai vorbim de a stabili un "config" fișierul pentru SSH.
SSH va arata pentru utilizator's `~/.ssh/config file. Eu pe al meu setup ca:
Host gitserv
Hostname remote.server.com
IdentityFile ~/.ssh/id_rsa.github
IdentitiesOnly yes # see NOTES below
Și adaug-o la distanță git repository:
git remote add origin git@gitserv:myrepo.git
Și apoi git comenzi de lucru în mod normal pentru mine.
git push -v origin master
NOTE
IdentitiesOnly da
este necesar pentru a a preveni SSH comportamentul implicit de a trimite identitatea fișier de potrivire implicit de fișier pentru fiecare protocol. Dacă aveți un fișier cu numele ~/.ssh/id_rsa
care vor fi încercate ÎNAINTE de ta `~/.ssh/id_rsa.github fără această opțiune.Bibliografie
Ceva de genul asta ar trebui sa mearga (sugerat de către orip):
ssh-agent bash -c 'ssh-add /somewhere/yourkey; git clone [email protected]:user/project.git'
dacă preferați subshells, ai putea încerca următoarele (deși este mult mai fragil):
ssh-agent $(ssh-add /somewhere/yourkey; git clone [email protected]:user/project.git)
Git va invoca SSH care va găsi agent de variabila de mediu; acesta, la rândul său, cheia încărcate.
Alternativ, setarea "ACASĂ" poate face, de asemenea truc, dacă ești dispus să setup un director care conține numai un .ssh
director ca "ACASĂ"; acest lucru poate conține o identitate.pub, sau o config setarea IdentityFile.
Pornind de la Git 2.3.0 avem, de asemenea, simplă comandă (nici un fișier de configurare este necesar):
GIT_SSH_COMMAND='ssh -i private_key_file' git clone user@host:repo.git
Aveți nevoie de un restart pentru serviciul ssh pe mașina dumneavoastră.
Pentru a rezuma răspunsurile și commentscel mai bun mod de a configura git de a utiliza diferite fișiere cheie și apoi uita despre asta, care sprijină, de asemenea, utilizatori diferiți pentru aceeași gazdă (de exemplu, un personal de pe contul GitHub și o), care funcționează pe Windows la fel de bine, este de a edita ~/.ssh/config "(sau " c:\Users\<dvs. de utilizator>\.ssh\config
) și să specificați mai multe identități:
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
Apoi, pentru a clona un proiect ca dvs. personal de utilizator, trebuie doar să rulați regulat `git clona comandă.
Pentru a clona repo ca workuser
, run git clona git@github-work:company/project.git
.
Cu git 2.10+ (T3 2016: lansat Sept. 2d, 2016), aveți posibilitatea să setați o configurare pentru GIT_SSH_COMMAND
(și nu doar o variabilă de mediu așa cum este descris în Rober Jack Va's răspunde)
A se vedea comite 3c8ede3 (26 Iunie 2016) până la Nguyễn-Leaáam Ngọc Duy (pclouds
).
(Fuzionat cu Junio C Hamano -- gitster
-- în comite dc21164, 19 Iulie 2016)
O nouă configurație variabilă de bază.sshCommand` a fost adăugat la precizați ce valoare pentru GIT_SSH_COMMAND pentru a utiliza pe repository.
core.sshCommand:
Dacă această variabilă este setată,
git fetch " și " git push
va folosi comanda specificată în loc dessh
atunci când au nevoie să se conecteze la un sistem la distanță. Comanda este în aceeași formă caGIT_SSH_COMMAND
variabila de mediu și este înlocuită atunci când variabila de mediu este stabilit.
Aceasta înseamnă git clona
poate fi:
cd /path/to/my/repo
git config core.sshCommand 'ssh -i private_key_file'
# later on
git clone host:repo.git
O modalitate mai bună idee să adaug că host sau ip la `.ssh/config file astfel:
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)
M-am dus cu GIT_SSH variabilă de mediu. Aici's înveliș mea, similară cu cea de la Joe Bloc de mai sus, dar se ocupă de orice sumă de argumente.
Fișierul ~/gitwrap.sh
#!/bin/bash
ssh -i ~/.ssh/gitkey_rsa "$@"
Apoi, în a mea .bashrc, se adaugă următoarele:
export GIT_SSH=~/gitwrap.sh
Problema este atunci când aveți diferite depozitele de la distanță pe aceeași gazdă (sa zicem github.com), și doriți pentru a interacționa cu ei folosind diferite chei ssh (de exemplu, diferite GitHub conturi).
În scopul de a face asta:
# Key for usual repositories on github.com
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa
# Key for a particular repository on github.com
Host XXX
HostName github.com
User git
IdentityFile ~/.ssh/id_other_rsa
Făcând acest lucru vă asocia la a doua cheie cu un nou nume prietenos "XXX" pentru github.com.
2), Atunci trebuie să modificați de la distanță originea special de depozit, astfel încât acesta utilizează numele prietenos te'am juste definite.
Du-te la depozit local folder într-un prompt de comandă și de afișare curent de la distanță origine:
>git remote -v
origin [email protected]:myuser/myrepo.git (fetch)
origin [email protected]:myuser/myrepo.git (push)
Apoi schimba origine cu:
>git remote set-url origin git@XXX:myuser/myrepo.git
>git remote -v
origin git@XXX:myuser/myrepo.git (fetch)
origin git@XXX:myuser/myrepo.git (push)
Acum puteți împinge, aduce cu tasta dreapta în mod automat.
Dacă nici una dintre soluțiile de lucru pentru tine, și ați creat mai multe ssh-chei, dar încă nu poate face lucruri simple cum ar fi
git pull
apoi, presupunând că aveți două chei ssh fișiere, cum ar fi
id_rsa
id_rsa_other_key
apoi în interiorul git repo, încercați:
# Run these commands INSIDE your git directory
eval `ssh-agent -s`
ssh-add ~/.ssh/id_rsa
ssh-add ~/.ssh/id_rsa_other_key
și, de asemenea, asigurați-vă că github implicit numele de utilizator și id-ul de utilizator sunt corecte prin:
# Run these commands INSIDE your git directory
git config user.name "Mona Lisa"
git config user.email "[email protected]"
Vezi https://gist.github.com/jexchan/2351996 pentru mai multe informații.
Multe dintre aceste soluții uitat ispititoare. Cu toate acestea, am găsit generic git-ambalaj-script abordare la link-ul următor pentru a fi cele mai utile:
Cum pentru a Specifica o Cheie ssh File cu git
command
Ideea fiind că nu există nici o git
de comandă cum ar fi următoarele:
git -i ~/.ssh/thatuserkey.pem clone [email protected]:/git/repo.git
Alvin's soluție este de a utiliza un bine definite bash script înveliș care umple acest gol:
git.sh -i ~/.ssh/thatuserkey.pem clone [email protected]:/git/repo.git
Unde git.sh` este:
#!/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 [ "$1" = "-i" ]; then
SSH_KEY=$2; 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
[ "$1" = "git" ] && shift
# Run the git command
git "$@"
Pot confirma că acest lucru s-a rezolvat problema am avut cu user/cheie de recunoaștere pentru o distanță bitbucket repo cu git de actualizare de la distanță
, git pull", și " git clona
; toate de care acum funcționează bine într-un cron job script care a fost de altfel nu are probleme de navigație limitată-shell. Am fost, de asemenea, capabil de a apela acest script din cadrul R și încă rezolva exact același cron
executa problema
(de exemplu, sistemul("bash git.sh -i ~/.ssh/thatuserkey.pem pull")`).
Nu că R este aceeași ca Ruby, dar daca-R face-o... O:-)
Atunci când aveți nevoie să se conecteze la github cu o cerere normală (git pull origine master), setarea Gazdă ca
*in
~/.ssh/config` a lucrat pentru mine, orice altă Gazdă (de exemplu, "github" sau "gb") n't de lucru.
Host *
User git
Hostname github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_xxx
Aveți nevoie pentru a crea un ~/.ssh/config de mai jos
Host <Your bitbucket server>
User <userid>
Hostname <Your bitbucket server as above>
IdentitiesOnly yes
IdentityFile ~/.ssh/id_rsa<file> This is your private key file
permisiunea ca mai jos
-rw------- $HOME/.ssh/config
Adăuga cheia publică în git (cat ~/.ssh/id_rsa_pub [sau simillar nume])
și apoi git clona de mai jos
git clone ssh://[email protected]/userid/test.git
dacă aveți director de pe calea ta în cazul în care doriți să semneze cu o anumită identifyfile puteți specifica pentru a utiliza o anumită identifica fișierul prin intermediul .ssh/config prin setarea ControlPath
exemplu:
gazdă github.com ControlPath ~/Proiectelor/locul de muncă/** HostName github.com IdentityFile ~/.ssh/id_work Utilizator git
Apoi ssh
va utiliza specificate de identitate fișier atunci când faci git comenzi sub anumit traseu de lucru.
În Windows cu Git Bash puteți utiliza următoarele opțiuni pentru a adăuga un depozit
ssh-agent bash -c 'ssh-add "cheie-adresa"; git remote adauga origine "rep-adresa"'
de exemplu: ssh-agent bash -c 'ssh-add /d/test/PrivateKey.ppk; git remote adauga origine [email protected]:test/test.git'
Care cheia privată este, în unitatea D, dosar test de calculator. De asemenea, dacă doriți pentru a clona un depozit, puteți schimba git remote adauga origine " cu " git clona
.
După ce introduceți acest lucru la Git Bash, vi se va cere pentru o frază de acces!
Fi Conștienți de faptul că openssh cheie privată și chit cheie privată sunt diiferent!
Dacă ați creat cheile cu puttygen, trebuie să efectuați conversia cheia privată pentru a openssh!