Git पर शेल कमांड निष्पादित करते समय निजी SSH-कुंजी का उपयोग कैसे करें?


1108

एक असामान्य स्थिति शायद, लेकिन मैं स्थानीय कंप्यूटर से शेल (गिट) कमांड को निष्पादित करते समय उपयोग करने के लिए एक निजी एसएसएच-कुंजी निर्दिष्ट करना चाहता हूं।

मूल रूप से इस तरह:

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

या इससे भी बेहतर (रूबी में):

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

मैंने नेट :: एसएसएच के साथ एक दूरस्थ सर्वर से कनेक्ट होने के उदाहरण देखे हैं जो एक निर्दिष्ट निजी कुंजी का उपयोग करता है, लेकिन यह एक स्थानीय कमांड है। क्या यह संभव है?


6
देखें SuperUser में यह सवाल भी है।
फ्लि‍म

28
मैं सोच रहा हूँ कि यह इतना असामान्य क्यों है कि Git के पास -iविकल्प नहीं sshहै।
निक

29
2.10 git (Q3 2016) के साथ, आपके पास एक नया कॉन्फ़िगरेशन भी है git config core.sshCommand 'ssh -i private_key_file':। देखें नीचे मेरा उत्तर
VonC

3
मेरी राय में, HeyWatchThis उत्तर को स्वीकृत उत्तर होना चाहिए क्योंकि यह सभी git कमांड को सेटअप के बाद सामान्य रूप से निष्पादित करने की अनुमति देता है, बजाय प्रत्येक git कमांड के लिए एक उपसमूह बनाने की आवश्यकता होती है क्योंकि वर्तमान स्वीकृत उत्तर की आवश्यकता होती है।
gloriphobia

जवाबों:


797

कुछ इस तरह काम करना चाहिए (orip द्वारा सुझाया गया):

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

यदि आप उपधाराएं पसंद करते हैं, तो आप निम्नलिखित की कोशिश कर सकते हैं (हालांकि यह अधिक नाजुक है):

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

Git SSH का आह्वान करेगा जो पर्यावरण चर द्वारा अपने एजेंट को खोजेगा; बदले में, यह कुंजी लोड होगी।

वैकल्पिक रूप से, सेटिंग HOMEट्रिक भी कर सकती है, बशर्ते आप एक डायरेक्टरी सेटअप करने के लिए तैयार हों जिसमें केवल एक .sshडायरेक्टरी हो HOME; इसमें या तो एक पहचान हो सकती है। पब, या एक फ़ाइल की पहचान करने के लिए एक विन्यास फ़ाइल


5
लेकिन यह कुंजी को स्थायी रूप से स्वीकृत SSH- कुंजी के रूप में जोड़ देगा, है ना? मैं उससे बचना चाहता हूं ताकि theuser2 theuser की परियोजनाओं के साथ खिलवाड़ न कर सके। यह एक वेब अनुप्रयोग के लिए है, इसलिए विभिन्न ओएस-उपयोगकर्ताओं का उपयोग करना व्यावहारिक नहीं है, जो सबसे अच्छा विकल्प होता।
क्रिस्टोफर

28
नहीं, जब git पूरा हो जाता है, ssh- एजेंट समाप्त हो जाता है, और कुंजी भूल जाती है।
मार्टिन वी। लोविस

6
यह कमांड विंडोज़ गेट बैश पर काम नहीं करता है। यह अप्रत्याशित टोकन 'ssh-add' के पास वाक्यविन्यास त्रुटि कहता है
मोहित

116
फिक्स्ड कमांड लाइन (विंडोज़ या ssh-agent bash -c 'ssh-add sshkey; git clone url'
लिनेक्स के लिए

4
ssh-agent $(..)वाक्य रचना मेरे लिए काम नहीं कर रहा है और मैं नहीं कर रहा हूँ इस यकीन है कि कैसे काम के लिए लगता है: (बा) श के अंदर आदेश पर अमल करना चाहिए $(..)पैरामीटर के रूप में उत्पादन के साथ पहले, ssh-एजेंट तो चलाते हैं।
जोहान्स की मछली 'ज़ीमेक

1199

इनमें से किसी भी समाधान ने मेरे लिए काम नहीं किया।

इसके बजाय, मैं @Martin v। Löwis configके SSH के लिए एक फ़ाइल स्थापित करने का उल्लेख करता हूं ।

SSH उपयोगकर्ता की ~/.ssh/configफ़ाइल को देखेगा । मेरे पास मेरा सेटअप है:

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

और मैं एक रिमोट गिट रिपॉजिटरी जोड़ता हूं:

git remote add origin git@gitserv:myrepo.git

और फिर git कमांड मेरे लिए सामान्य रूप से काम करती है।

git push -v origin master

टिप्पणियाँ

  • IdentitiesOnly yesके लिए आवश्यक है SSH डिफ़ॉल्ट व्यवहार को रोकने के लिए प्रत्येक प्रोटोकॉल के लिए डिफ़ॉल्ट फ़ाइल नाम मिलान पहचान फ़ाइल को भेजने की। यदि आपके पास एक फ़ाइल है जिसका नाम इस विकल्प के बिना ~/.ssh/id_rsaआपके पहले से आज़माया जा ~/.ssh/id_rsa.githubसकता है।

संदर्भ


17
मैंने पाया कि जब आप .ssh / config का उपयोग करके कई कुंजियाँ निर्दिष्ट करते हैं, तो आपको "git रिमोट ऐड" कमांड के भाग के रूप में होस्ट मित्र का नाम लाइन "होस्ट" में उपयोग करने की आवश्यकता होती है। यदि लाइन "होस्ट stg" है, तो आपको git Remote add <someName> user @ stg: /path_to_git_repo.git "का उपयोग करने की आवश्यकता है। यदि आप user@myserver.com जैसे सटीक सर्वर नाम का उपयोग करते हैं: apath_to_git_repo.git, कॉन्फ़िग फ़ाइल। git द्वारा नहीं उठाया गया है। इसलिए, यह निजी कुंजी फ़ाइल को सही ढंग से नहीं उठा रहा है। मैंने गितुब और हेरोकू के लिए एक ही सामग्री को धक्का देकर यह कोशिश की है और केवल तभी काम करता है जब आप "गिट रिमोट ऐड" में दोस्ताना नाम देते हैं
गोपीनाथ एमआर

2
मैं मेजबान के बारे में निश्चित नहीं था। मैं इस लिंक मिल गया: gist.github.com/jexchan/2351996
करस्टेन

1
अगर आप कुछ git रिपॉजिटरी के लिए कुछ महत्वपूर्ण फाइलें रखना चाहते हैं, तो यहां देखें
e271p314

1
आप Host remote.server.comमूल URL
MauganRa

5
दो बदलावों के बाद इसने मेरे लिए काम किया। यदि कॉन्फ़िगरेशन फ़ाइल नई है, तो करना न भूलें chmod 600 ~/.ssh/config( यहां देखें )। और अगर आप GitHub का उपयोग कर रहे हैं, तो इसके Host gitservसाथ बदलें Host github.com, छोड़ें Hostname remote.server.com, और साथ रिमोट जोड़ें git remote add origin git@github.com:user_name/repo_name.git
मिगेलमोरिन

479

Git 2.3.0 से शुरू करके हमारे पास सरल कमांड (कोई कॉन्फिग फाइल की जरूरत नहीं है):

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

3
cannot run ssh -i /home/vagrant/.ssh/git: No such file or directoryहालांकि मुझे यह मिलता 444 Nov 16 18:12 /home/vagrant/.ssh/gitहैls -l /home/vagrant/.ssh/git
ted

3
@ted: chmod 400 /home/vagrant/.ssh/git
यश

8
अच्छा और आसान उपाय। मेरा सुझाव है कि यदि आपको ऐसा करने की आवश्यकता है तो एक उपनाम बनाना होगा।
लेज़स मेयर

5
भूलना मत chmod 400 <path-to-private-key-file>। अन्यथा git कमांड बिना किसी विशेष त्रुटि संदेश के विफल हो सकती है ...
Eonil

5
यह अच्छा होगा यदि इस उत्तर में यह -o IdentitiesOnly=yesसुनिश्चित करना भी शामिल है कि निर्दिष्ट कुंजी का -iउपयोग किया जाता है (एसएसएच एजेंट से कुंजी के विपरीत)।
रोबिन

423

अन्य लोगों के सुझाव ~/.ssh/configअतिरिक्त जटिल हैं। यह उतना ही सरल हो सकता है:

Host github.com
  IdentityFile ~/.ssh/github_rsa

30
आपको IdentitiesOnlyविकल्प भी चाहिए।
फ्लिमल

4
@EnzeChi आपके पास रीमोट में हेरफेर करके कई गीथब खाते हो सकते हैं git remote add ssh://personal/org/proj.git && git remote add ssh://corporate/org/proj.git:। तो फिर तुम कैसी लगती है configHost personal HostName github.com ... Host corporate HostName github.com
एमोरी

@EnzeChi मैं ऐसा ही कुछ करता हूं ताकि मैं 2 अलग-अलग ssh कीज़ का इस्तेमाल करूं - एक लाने के लिए और दूसरा पुश करने के लिए। गर्भ में पासफ़्रेज़ नहीं होता है। धक्का करता है।
एमोरी

144

My_git_ssh_wrapper की सामग्री:

#!/bin/bash

ssh -i /path/to/ssh/secret/key $1 $2

तब आप कुंजी का उपयोग करके कर सकते हैं:

GIT_SSH=my_git_ssh_wrapper git clone git@github.com:TheUser/TheProject.git

4
बहुत अच्छा समाधान यदि आपके पास एक ही डोमेन में एक से अधिक खाते हैं, जो अन्य समाधान अच्छी तरह से नहीं संभालते हैं
Beka

1
अच्छा समाधान है। आप इसे> GIT_SSH = my_git_ssh_wrapper के साथ भी सरल बना सकते हैं; git clone git@github.com: TheUser / TheProject.git
शिव

2
यह समाधान उन स्थितियों को भी शामिल करता है जब आप घर की निर्देशिका के बिना खाते से गिट का उपयोग करना चाहते हैं।
piotrekkr

बहुत खुबस। आप इस तरह से निजी सर्वरों में भी उपयोग कर सकते हैं:GIT_SSH="git_wrapper" git clone ssh://user@server/path/to/project"
टन

1
यह एकमात्र तरीका है जिसने मेरे लिए एक
साइबर

113

Git के साथ 2.10+ (Q3 2016: जारी सेप्ट 2 डी, 2016), आपके पास रॉबर्ट जैक विल के उत्तर के रूप में वर्णित (और न केवल एक पर्यावरण चर के लिए एक कॉन्फ़िगरेशन सेट करने की संभावना है )GIT_SSH_COMMAND

Nguy Thn Thái pcloudsNgcc Duy ( ) द्वारा प्रतिबद्ध 3c8ede3 (26 जून 2016) देखें ।
(द्वारा विलय Junio सी Hamano - gitster- में dc21164 प्रतिबद्ध , 19 जुला 2016)

रिपॉजिटरी का उपयोग करने के core.sshCommandलिए क्या मूल्य निर्दिष्ट करने के लिए एक नया कॉन्फ़िगरेशन चर जोड़ा गया GIT_SSH_COMMANDहै।

core.sshCommand:

यदि यह चर सेट है, git fetchऔर git pushइसके बजाय निर्दिष्ट कमांड का उपयोग करेगा sshजब उन्हें दूरस्थ सिस्टम से कनेक्ट करने की आवश्यकता होगी।
आदेश GIT_SSH_COMMANDपर्यावरण चर के रूप में एक ही रूप में है और पर्यावरण चर सेट होने पर ओवरराइड किया जाता है।

इसका मतलब यह git cloneहो सकता है:

cd /path/to/my/repo
git config core.sshCommand 'ssh -i private_key_file' 
# later on
git clone host:repo.git

आप इसे केवल एक कमांड के लिए भी सेट कर सकते हैं:

git -c core.sshCommand="ssh -i private_key_file" clone host:repo.git

यह एक GIT_SSH_COMMANDपर्यावरण चर सेट करने से आसान है , जो कि, विंडोज पर, जैसा कि माटी दास कुटी-क्रेसज़ेक द्वारा उल्लेख किया गया है , होगा।

set "GIT_SSH_COMMAND=ssh -i private_key_file"

@Flimm रिलीज की तारीख: calendar.google.com/calendar/...
VonC

इसे जारी कर दिया गया है।
फ्लिम्स

4
काम करता है। दोस्तों को इसका सबसे अच्छा जवाब देना चाहिए। एक बार जारी किए जाने के बाद, इसे पहले से कॉपी किए गए / tmp के संस्करण के साथ .it / config फ़ाइल को अलग करने के लिए जानकारीपूर्ण हो सकता है। एक नई प्रविष्टि बनाई गई है: sshCommand = ... इसके लिए जो मूल्य है, मैंने 'git config core.sshCommand "ssh -i $ HOME / .ssh / privatekeyfile" का उपयोग किया है।
वीकेपॉइंटर

1
@Spanky आप इनलाइन कमांड git -c core.sshCommand="ssh -i private_key_file" clone host:repo.gitको कॉन्फ़िगर सेट के बाद कर सकते हैंgit config core.sshCommand 'ssh -i private_key_file'
dav_i

1
यह निश्चित रूप से सबसे अच्छा जवाब है!
वैगनर पैट्रियोटा

110

उत्तर और टिप्पणियों को समेटने के लिए, विभिन्न कुंजी फ़ाइलों का उपयोग करने के लिए गिट सेट करने का सबसे अच्छा तरीका है और फिर इसके बारे में भूल जाते हैं, जो एक ही मेजबान के लिए अलग-अलग उपयोगकर्ताओं का समर्थन करता है (उदाहरण के लिए एक व्यक्तिगत गिटहब खाता और एक काम), जो विंडोज पर काम करता है साथ ही, ~/.ssh/config(या c:\Users\<your user>\.ssh\config) को संपादित करने और कई पहचान निर्दिष्ट करने के लिए है:

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

फिर, अपने व्यक्तिगत उपयोगकर्ता के रूप में एक परियोजना को क्लोन करने के लिए, बस नियमित git cloneकमांड चलाएं ।

रेपो को क्लोन के रूप में workuserचलाने के लिए git clone git@github-work:company/project.git


3
मैंने आपको नीचा दिखाया क्योंकि आप जो कुछ भी कहते हैं वह पहले से ही ऊपर के उत्तर में और मेरी आँखों में, और भी स्पष्ट रूप से कवर किया गया है। उदाहरण के लिए, आप उपयोगकर्ता को क्रमशः dandv और कर्मकार के रूप में क्यों परिभाषित करते हैं?
हरोत्पत्ति

2
आपने 4 साल पुराने प्रश्न का उत्तर दिया, जिसमें कोई नया सुझाव नहीं है और आप दावा कर रहे हैं कि आपका उत्तर "सबसे अच्छा तरीका" है। इसके अलावा आपने अपने जवाब को हटाने के लिए अन्य उपयोगकर्ताओं को नीचा दिखाया और परेशान किया ... बस अपना एक धक्का देने के लिए।
rudimeier

@hroptatyr: मैंने उपयोग किया है dandvऔर workuserमेरे उदाहरण का समर्थन करने के लिए, "उदाहरण के लिए एक व्यक्तिगत GitHub खाता और एक काम"। dandvमेरा GitHub उपयोगकर्ता नाम है।
दान डैस्कलेस्कु

12
मुझे लगता है कि यह @ थैंस्टर की तुलना में बेहतर उत्तर है, यदि केवल इसलिए कि यह मेजबान उपनामों की व्याख्या करता है।
डेविड मोल्स

2
मुझे यह उत्तर पसंद है। हालाँकि, मेरे लिए यह केवल तभी काम करता है जब मैं IdentitiesOnly yesअपनी ssh config फाइल में जोड़ता हूँ।
winni2k

75

जैसा कि यहाँ कहा गया है: https://superuser.com/a/912281/607049

आप इसे प्रति-रेपो कॉन्फ़िगर कर सकते हैं:

git config core.sshCommand "ssh -i ~/.ssh/id_rsa_example -F /dev/null"
git pull
git push

1
क्या करता -F /dev/nullहै? जहाँ तक मैं देख सकता हूँ यह ~/.ssh/configडिफ़ॉल्ट से configFile बदल जाएगा, लेकिन यह क्यों वांछित है? सैंडबॉक्स कमांड सुनिश्चित करने के लिए?
डोमिनिक

3
linuxcommand.org/man_pages/ssh1.html , कोई कॉन्फ़िग फ़ाइल निर्दिष्ट नहीं करता है, इसलिए जब git ssh चलाएगा, तो कोई कॉन्फ़िग फ़ाइल पास नहीं होगी (वास्तव में यह एक प्रकार का सैंडबॉक्स मोड है, बस उपयोगकर्ता कॉन्फ़िग डिफ़ॉल्ट विकल्पों को अनदेखा करें) सुपरयुसर में मूल धागा -F के बारे में अधिक जानकारी
डेविड

1
जिसकी मुझे तलाश थी। धन्यवाद!
१c:३५

कुबेर पर्यावरण में काम करने के लिए AAAAA + समाधान। धन्यवाद!
कोबरा बनाम निंजा

1
नमस्ते क्या आप जानते हैं कि इस सबमॉडल को कैसे प्रचारित किया जाए?
अर्का प्रवा बसु

38

समस्या तब होती है जब आपके पास एक ही होस्ट (github.com कहते हैं) पर अलग-अलग रिमोट रिपॉजिटरी होती हैं , और आप अलग-अलग ssh कीज़ (यानी अलग-अलग GitHub अकाउंट) का उपयोग करके उनसे बातचीत करना चाहते हैं ।

ऐसा करने के क्रम में:

  1. पहले आपको ~/.ssh/configफ़ाइल में अपनी अलग-अलग कुंजियाँ घोषित करनी चाहिए ।

    # 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

    ऐसा करके आप github.com के लिए एक नए अनुकूल नाम "XXX" के साथ दूसरी कुंजी जोड़ते हैं।

  2. फिर आपको अपने विशेष रिपॉजिटरी के दूरस्थ मूल को बदलना होगा, ताकि यह आपके द्वारा परिभाषित अनुकूल नाम का उपयोग करे।

    कमांड प्रॉम्प्ट के भीतर अपने स्थानीय रिपॉजिटरी फ़ोल्डर में जाएं, और वर्तमान रिमोट मूल को प्रदर्शित करें:

    >git remote -v
    origin  git@github.com:myuser/myrepo.git (fetch)
    origin  git@github.com:myuser/myrepo.git (push)

    इसके बाद मूल बदलें:

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

    अब आप पुश कर सकते हैं, लाएं ... स्वचालित रूप से सही कुंजी के साथ।


1
यह मेरे दिमाग में सबसे "सही" उत्तर है, जहां आप अपनी ssh config फाइल में कनेक्शन और कुंजियों को व्यवस्थित करते हैं जो कि सबसे अच्छा अभ्यास और सहायक लंबी अवधि है।
jamescampbell

अन्य समाधान वर्कअराउंड की तरह लगते हैं, यह उपकरण का समर्थन करता है महान सुविधा का उपयोग कर रहा है।
क्रेग। C

बहुत बढ़िया, वास्तव में मैं क्या देख रहा था, धन्यवाद !!
मैजिकमेकर

37
GIT_SSH_COMMAND="ssh -i /path/to/git-private-access-key" git clone $git_repo

या

export GIT_SSH_COMMAND="ssh -i /path/to/git-private-access-key"
git clone REPO
git push

यह एक मेरे लिए काम किया।
मुहम्मद_अयज

36

इस तरह से उस होस्ट या आईपी को .ssh/configफ़ाइल में जोड़ने का बेहतर विचार है :

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)

1
यह उपयोगी है, लेकिन आप उस होस्टनाम के साथ सभी इंटरैक्शन के लिए रेपो कुंजी का उपयोग करते हैं। यदि एक ही सर्वर पर अन्य रिपॉजिट हैं, जिन्हें अलग-अलग कुंजियों की आवश्यकता होती है, तो एक रैपर का उपयोग करके और इसे GIT_SSH के साथ उपयोग करने के लिए गिट बेहतर है।
जो ब्लॉक

11
यह जरूरी नहीं कि सच हो। मैं गितुब के लिए कई कुंजियों का उपयोग करता हूं - एक काम के लिए और एक मेरे व्यक्तिगत खाते के लिए। आपको "होस्ट" के लिए एक डोमेन नाम नहीं रखना होगा। आप अपनी मर्जी से किसी भी तरह का उर्फ ​​डाल सकते हैं। उदाहरण के लिए, मैं gh-home और gh-work को मेरे होस्टनाम के रूप में उपयोग करता हूं और जब मैं क्लोन का उपयोग करता हूं, उदाहरण के लिए, git clone git@gh-work:repo/project.git मेरे ~ / .ssh / config में मेरे दो खंड होते हैं जो दोनों HostName के लिए github.com का उपयोग करते हैं। उनके पास बस अलग-अलग आइडेंटिटीफाइल और होस्ट
ब्लॉकलूप

@ brettof86 यह रणनीति सबसे अधिक भाग के लिए काम करती है, लेकिन आप क्या कर रहे हैं जब आप जिस भंडार की जाँच कर रहे हैं वह एक रत्न पर निर्भर करता है जिसे गीथूब पर भी होस्ट किया जाता है? मणिफ़ाइल अभ्यस्त में github रेपो के संदर्भ में आपके "उर्फ" शामिल हैं, अच्छी तरह से जब तक आप परियोजना पर अन्य डेवलपर्स के लिए चीजों को तोड़ना नहीं चाहते ...
ktec

@ brettof86 मेरे पास दो अलग-अलग github खाते (कार्य, घर) हैं, लेकिन मुझे मेरे लिए काम करने के लिए उदाहरण नहीं मिल सकता है। आप दो होने का एक नमूना पोस्ट कर सकते हैं?
Climbs_lika_Spyder

@Climbs_lika_Spyder यहाँ है मेरे ~/.ssh/config pastebin.com/8rYn7yCi
Blockloop

32

मैं GIT_SSH पर्यावरण चर के साथ गया था। यहाँ मेरा रैपर है, जो ऊपर से जो ब्लॉक के समान है, लेकिन किसी भी तर्क को संभालता है।

फ़ाइल ~ / gitwrap.sh

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

फिर, मेरे .bashrc में, निम्नलिखित जोड़ें:

export GIT_SSH=~/gitwrap.sh

मैंने इसे .bashrc पर सेट किया। लेकिन जब मैं ओपेनशिफ्ट इंस्टेंस पर लॉगिन करता हूं, तो यह कॉल नहीं लगता है। क्या मैं कुछ भूल रहा हूँ ?
जिगर शाह

यह मेरे लिए एक त्रुटि के साथ विफल रहता है .. इसकी स्क्रिप्ट घटना को खोजने में सक्षम नहीं है, हालांकि इसके बारे में .. सुनिश्चित नहीं है कि क्या चल रहा है ... त्रुटि: /tmp/gitwrap.sh नहीं चला सकता: ऐसी कोई फ़ाइल या निर्देशिका
ap1234

यदि आप "ऐसी कोई फ़ाइल या निर्देशिका" त्रुटि का सामना नहीं करते हैं gitwrap.sh, उदाहरण के लिए पूर्ण पथ डालें ,/home/ubuntu/gitwrap.sh
ताहिर अख्तर

आप -o StrictHostKeyChecking=nossh कमांड में जोड़ना चाहते हैं
dan-man

12

यदि यहां कोई अन्य समाधान आपके लिए काम नहीं करता है, और आपने कई ssh-keys बनाए हैं, लेकिन फिर भी सरल कार्य नहीं कर सकते हैं

git pull

तो मान लें कि आपके पास दो ssh कुंजी फाइलें हैं

id_rsa
id_rsa_other_key

फिर git रेपो के अंदर, कोशिश करें:

# Run these commands INSIDE your git directory
eval `ssh-agent -s`
ssh-add ~/.ssh/id_rsa
ssh-add ~/.ssh/id_rsa_other_key

और यह भी सुनिश्चित करें कि आपके github डिफ़ॉल्ट उपयोगकर्ता नाम और उपयोगकर्ता द्वारा सही हैं:

# Run these commands INSIDE your git directory
git config user.name "Mona Lisa"
git config user.email "mona.lisa@email.com"

अधिक जानकारी के लिए https://gist.github.com/jexchan/2351996 देखें ।


ध्यान दें यदि आप प्राप्त करते हैं Could not open a connection to your authentication agent., तो कोशिश करें $ eval `ssh-agent -s`, और फिर से प्रयास करें।
cgnorthcutt

1
जो लोग खो गए हैं, उनके लिए ssh-addकमांड ट्रिक ने मेरे लिए काम किया। उन लोगों की सूची में पहचान कुंजी जोड़ें, जो ssh प्रामाणिक होने पर आजमाए जाते हैं। यह मेरे लिए अच्छी तरह से काम किया!
बेन कार्टराइट

आपको क्यों लगता है कि यह मायने रखता है कि आप किस निर्देशिका में चलते हैं ssh-add?
ट्रिपल

@BenCartwright क्योंकि आप स्थानीय सेटिंग्स को संशोधित कर रहे हैं, न कि वैश्विक सेटिंग्स को। यह दृष्टिकोण .gitरेपो के अंदर संशोधित करता है न कि वैश्विक रूप से गिट प्रोग्राम के लिए। आप --globalवैश्विक उपयोगकर्ता नाम और ईमेल सेट करने के लिए उपयोग कर सकते हैं ।
cgnorthcutt

11

जब आपको एक सामान्य अनुरोध ( git pull origin master) के साथ github से कनेक्ट करने की आवश्यकता होती है , तो होस्ट को मेरे लिए काम करने के रूप *में सेट करें ~/.ssh/config, कोई भी अन्य होस्ट (जैसे, "जीथब" या "जीबी") काम नहीं कर रहा था।

Host *
    User git
    Hostname github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_xxx

साथ ही पूरे "होस्ट *" को तब बाहर छोड़ सकते हैं।
लायनेलो

1
यह शायद काम नहीं कर रहा था क्योंकि यह आपके दूरस्थ URL से मेल नहीं खाता था। यदि आप उपयोग करना चाहते हैं Host my-host-alias, तो आपको सेट करना होगा remote.origin.url=git@my-host-alias:[username]/[repo].git
डेविड मोल्स

11

इनमें से कई समाधान मोहक दिखे। हालाँकि, मुझे सबसे अधिक उपयोगी होने के लिए निम्न लिंक पर जेनेरिक गिट-रैपिंग-स्क्रिप्ट दृष्टिकोण मिला:

gitकमांड के साथ ssh की फाइल को कैसे निर्दिष्ट करें

बिंदु यह है कि gitनिम्नलिखित जैसी कोई कमांड नहीं है :

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

एल्विन का समाधान एक अच्छी तरह से परिभाषित बैश-आवरण स्क्रिप्ट का उपयोग करना है जो इस अंतर को भरता है:

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

कहाँ git.shहै:

#!/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 "$@"

इस बात की पुष्टि कर सकते हैं कि यह एक समस्या के साथ मैं एक दूरस्थ bitbucket रेपो के लिए उपयोगकर्ता / कुंजी मान्यता के साथ हो रही थी हल git remote update, git pullऔर git clone; ये सभी अब एक cronनौकरी की स्क्रिप्ट में ठीक काम करते हैं जो अन्यथा सीमित शेल को नेविगेट करने में समस्या थी। मैं आर के भीतर से इस स्क्रिप्ट को कॉल करने में सक्षम था और अभी भी सटीक एक ही cronनिष्पादित समस्या (जैसे system("bash git.sh -i ~/.ssh/thatuserkey.pem pull")) को हल करता हूं ।

ऐसा नहीं है कि आर रूबी के समान है, लेकिन अगर आर यह कर सकता है ... ओ :-)


1
बहुत अच्छा लग रहा है! मैं इसका परीक्षण करूंगा और वापस जवाब दूंगा।
ब्लूबर्ड

3
सिंटैक्स के अलावा, यह रॉबर्ट जैक विल के उत्तर केGIT_SSH_COMMAND="ssh -i ~/.ssh/thatuserkey.pem" git clone clone thatuser@myserver.com:/git/repo.git अनुसार कैसे बेहतर है ?
डेविड मोल्स

6

यदि आपके पास अपने पथ पर निर्देशिका है जहाँ आप दिए गए पहचान पत्र के साथ हस्ताक्षर करना चाहते हैं, तो आप ControlPathउदाहरण के लिए .ssh / config फ़ाइल के माध्यम से एक विशिष्ट पहचान फ़ाइल का उपयोग करने के लिए निर्दिष्ट कर सकते हैं :

host github.com
  ControlPath ~/Projects/work/**
  HostName github.com
  IdentityFile ~/.ssh/id_work
  User git

फिर sshदिए गए कार्य पथ के तहत git कमांड करते समय निर्दिष्ट पहचान फ़ाइल का उपयोग करेगा।


बाद में पता चला कि आप गुण भी सेट कर सकते हैं ControlMaster autoऔर ControlPersist yes, ताकि आपको हर बार पासवर्ड को फिर से लिखना न पड़े। इस लेख
cristobal

3

आपको नीचे के रूप में ~ / .ssh / config बनाना होगा

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

नीचे के रूप में अनुमति

-rw------- $HOME/.ssh/config

अपनी सार्वजनिक कुंजी को अपने git (cat ~ / .shsh / id_rsa_pub [या simillar name] में जोड़ें)

और फिर नीचे के रूप में क्लोन क्लोन करें

git clone ssh://blahblah@blah.com/userid/test.git

3

बहुत सारे अच्छे उत्तर, लेकिन उनमें से कुछ पूर्व प्रशासन ज्ञान ग्रहण करते हैं।

मुझे लगता है कि यह महत्वपूर्ण है स्पष्ट रूप से जोर देना है कि अगर आप वेब यूआरएल क्लोनिंग द्वारा अपनी परियोजना शुरू कर दिया - https://github.com/<user-name>/<project-name>.git
तो आप की जरूरत है सुनिश्चित करें कि url मूल्य के तहत [remote "origin"]में .git/config SSH यूआरएल में बदल गया था (नीचे दिए गए कोड ब्लॉक देखें)।

इसके साथ ही सुनिश्चित करें कि आप sshCommmandनीचे बताए अनुसार जोड़ें :

user@workstation:~/workspace/project-name/.git$ cat config
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    sshCommand = ssh -i ~/location-of/.ssh/private_key -F /dev/null <--Check that this command exist
[remote "origin"]
    url = git@github.com:<user-name>/<project-name>.git  <-- Make sure its the SSH URL and not the WEB URL
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master

इसके बारे में यहाँ और पढ़ें ।


1
बहुत बहुत धन्यवाद, इतना समय बिताने की कोशिश कर रहा था कि क्यों git ssh कुंजी का उपयोग नहीं कर रहा है। मुझे समझ नहीं आया कि क्यों github क्लोन बटन में डिफ़ॉल्ट रूप में https url देता है।
चक्रधर राजू

2

Git Bash के साथ विंडोज में आप ssh-agent bash -c 'ssh-add "key-address"; git remote add origin "rep-address"' उदाहरण के लिए एक रिपॉजिटरी जोड़ने के लिए निम्नलिखित का उपयोग कर सकते हैं : ssh-agent bash -c 'ssh-add /d/test/PrivateKey.ppk; git remote add origin git@git.test.com:test/test.git'कौन सी निजी कुंजी ड्राइव डी में है, कंप्यूटर का फ़ोल्डर परीक्षण। इसके अलावा, यदि आप एक रिपॉजिटरी को क्लोन करना चाहते हैं, तो आप के git remote add originसाथ बदल सकते हैं git clone

Git Bash में इसे दर्ज करने के बाद, यह आपसे पासफ़्रेज़ के लिए पूछेगा!

जागरूक रहो कि निजी कुंजी और पोटीन निजी कुंजी खुलता है!

यदि आपने पुट्टीजेन के साथ अपनी चाबियाँ बनाई हैं, तो आपको अपनी निजी कुंजी को ओपनश में बदलना होगा!


1

आप GIT_SSH पर्यावरण चर का उपयोग कर सकते हैं। लेकिन आपको शेल स्क्रिप्ट में ssh और विकल्पों को लपेटने की आवश्यकता होगी।

Git मैनुअल देखें: man gitअपने कमांड शेल में।


1

मैं अपने लैपटॉप पर अपने उद्देश्यों zshके लिए अपने zsh शेल को ssh-agentस्वचालित रूप से अन्य उद्देश्यों (यानी दूरस्थ सर्वर तक पहुंच) के लिए लोड करता हूं और विभिन्न कुंजियों को लोड किया जाता है। मैंने @ निक के उत्तर को संशोधित किया और मैं इसे अपने एक रिपोस के लिए उपयोग कर रहा हूं जिसे अक्सर ताज़ा करने की आवश्यकता होती है। (इस मामले में यह मेरा है dotfilesजो मैं अपने सभी मशीनों में समान और नवीनतम संस्करण चाहता हूं, जहां भी मैं काम कर रहा हूं।)

bash -c 'eval `ssh-agent`; ssh-add /home/myname/.dotfiles/gitread; ssh-add -L; cd /home/myname/.dotfiles && git pull; kill $SSH_AGENT_PID'
  • एक ssh- एजेंट स्पॉन
  • एजेंट में केवल पढ़ने के लिए कुंजी जोड़ें
  • निर्देशिका को मेरे गिट रेपो में बदलें
  • यदि cdरेपो डायर सफल है, तो रिमोट रेपो से खींचें
  • मार डाला ssh- एजेंट। (मैं नहीं चाहूंगा कि बहुत सारे एजेंट आसपास की ओर झुकें।)

1

के लिए gitlab RSAAuthentication yes

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

डॉक्टर यहाँ है


लिंक पर उल्लेख नहीं किया गया है जिसे आपने प्रदान किया है
rbennell


0

SSH पोर्ट संख्या 22 (डिफ़ॉल्ट) नहीं है, तो जोड़ने Port xxमें~/.ssh/config

मेरे मामले में (समानार्थक),

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

फिर कॉन्फ़िगरेशन में होस्ट शीर्षक का उपयोग करके क्लोन करें। ("my_synology"। @chopstik की "*" से बचने के लिए)

git clone my_synology:path/to/repo.git

0

यदि आप मेरे जैसे हैं, तो आप कर सकते हैं:

  • अपनी ssh चाबियों को व्यवस्थित रखें

  • अपने git क्लोन कमांड को सरल रखें

  • किसी भी संख्या में रिपॉजिटरी के लिए किसी भी कुंजी को संभालें।

  • अपने ssh कुंजी रखरखाव को कम करें।

मैं अपनी चाबी अपनी ~/.ssh/keysनिर्देशिका में रखता हूं ।

मैं कॉन्फ़िगरेशन पर अधिवेशन पसंद करता हूं।

मुझे लगता है कि कोड कानून है; यह जितना आसान है, उतना ही अच्छा है।

चरण 1 - उपनाम बनाएं

इस उपनाम को अपने शेल में जोड़ें: alias git-clone='GIT_SSH=ssh_wrapper git clone'

STEP 2 - स्क्रिप्ट बनाएं

इस ssh_wrapper स्क्रिप्ट को अपने PATH में जोड़ें :

#!/bin/bash
# Filename: ssh_wrapper

if [ -z ${SSH_KEY} ]; then
    SSH_KEY='github.com/l3x'  # <= Default key
fi
SSH_KEY="~/.ssh/keys/${SSH_KEY}/id_rsa"
ssh -i "${SSH_KEY}" "$@"

उदाहरण

Github.com/l3x कुंजी का उपयोग करें:

KEY=github.com/l3x git-clone https://github.com/l3x/learn-fp-go

निम्न उदाहरण भी github.com/l3x कुंजी (डिफ़ॉल्ट रूप से) का उपयोग करता है :

git-clone https://github.com/l3x/learn-fp-go

Bitbucket.org/lsheehan कुंजी का उपयोग करें:

KEY=bitbucket.org/lsheehan git-clone git@bitbucket.org:dave_andersen/exchange.git

टिप्पणियाँ

डिफ़ॉल्ट SSH_KEY को ssh_wrapper स्क्रिप्ट में उस समय बदलें, जिसका आप ज्यादातर समय उपयोग करते हैं। इस तरह, आपको अधिकांश समय प्रमुख चर का उपयोग करने की आवश्यकता नहीं है।

आप सोच सकते हैं, "अरे! यह एक उपनाम, एक स्क्रिप्ट और कुंजी की कुछ निर्देशिका के साथ बहुत कुछ चल रहा है," लेकिन मेरे लिए यह सम्मेलन है। मेरे सभी कार्यस्थान (और उस मामले के लिए सर्वर) समान रूप से कॉन्फ़िगर किए गए हैं।

यहां मेरा लक्ष्य उन आज्ञाओं को सरल बनाना है, जिन्हें मैं नियमित रूप से निष्पादित करता हूं।

मेरे सम्मेलनों, जैसे, बैश स्क्रिप्ट, उपनाम आदि, एक सुसंगत वातावरण बनाते हैं और मुझे चीजों को सरल रखने में मदद करते हैं।

KISS और नाम मायने रखते हैं।

अधिक डिज़ाइन युक्तियों के लिए मेरी पुस्तक से जाने में अध्याय 4 SOLID डिज़ाइन देखें : https://www.amazon.com/Learning-Functional-Programming-Lex-Sheehan-ebook/dp/B0725B8MYW

उम्मीद है की वो मदद करदे। - लेक्स



0

इस पद्धति के साथ समस्या यह है, कम से कम जब विंडोज पर bash.exe द्वारा चल रहा है, कि यह हर बार एक नई प्रक्रिया बनाएगा जो निष्क्रिय रहेगा।

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

यदि आप शेड्यूल पर रेपिग रेपो के लिए उपयोग करना चाहते हैं तो आपको अंत में "&& ssh-agent -k" जोड़ना होगा।

कुछ इस तरह:

ssh-agent bash -c 'ssh-add C:/Users/user/.ssh/your_key; git -C "C:\Path\to\your\repo" pull && ssh-agent -k' 

ssh-agent -k इस प्रक्रिया को पूरा करने पर मार देगा।


0

मुझे सिर्फ कुंजी जोड़ने की जरूरत है फिर गिट क्लोन को फिर से चलाएं।

ssh-add ~/.ssh/id_rsa_mynewkey
git clone git@bitbucket.org:mycompany/myrepo.git

-1

इस समस्या का हल ढूंढते हुए मैंने पाया ssh कुंजी हैक:

उदाहरण के लिए आपके पास कुंजियों के 2 अलग-अलग सेट हैं:

key1, key1.pub, key2, key2.pub

इन कुंजियों को अपनी .sshनिर्देशिका में रखें

अब अपनी .bashrcया .bash_profileअन्य फ़ाइल में, इन कमांड्स को जोड़ें

alias key1='cp ~/.ssh/key1 id_rsa && cp ~/.ssh/key1.pub id_rsa.pub'

alias key2='cp ~/.ssh/key2 id_rsa && cp ~/.ssh/key2.pub id_rsa.pub'

देखा! जब भी आप चाहते हैं, तो आपके पास कुंजी स्विच करने का एक शॉर्टकट है!

उम्मीद है इससे आपका काम बनेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.