सवाल गिट को कैसे बताएं कि किस निजी कुंजी का उपयोग करना है?


ssh है -i प्रमाणीकरण करते समय कौन सी निजी कुंजी फ़ाइल का उपयोग करने के लिए यह बताने का विकल्प:

-i identity_file

    जिसमें से एक फ़ाइल का चयन करता है   आरएसए या डीएसए प्रमाणीकरण के लिए पहचान (निजी कुंजी) पढ़ा जाता है।   डिफ़ॉल्ट है ~/.ssh/identity प्रोटोकॉल संस्करण 1 के लिए,   तथा ~/.ssh/id_rsa तथा ~/.ssh/id_dsa प्रोटोकॉल संस्करण 2 के लिए।   प्रति-होस्ट आधार पर पहचान फ़ाइलों को भी निर्दिष्ट किया जा सकता है   विन्यास फाइल में। एकाधिक होना संभव है -i विकल्प    (और विन्यास फाइलों में निर्दिष्ट कई पहचान)।

क्या बताने का एक समान तरीका है git एक निजी कुंजी फ़ाइल जिसमें कई निजी कुंजी वाले सिस्टम पर उपयोग किया जाता है ~/.ssh निर्देशिका?


497
2018-01-12 18:20


मूल


देख StackOverflow में यह सवाल भी। - Flimm
इसके अलावा भी serverfault.com/questions/194567/... - Machavity


जवाब:


में ~/.ssh/config, जोड़ें:

host github.com
 HostName github.com
 IdentityFile ~/.ssh/id_rsa_github
 User git

अब आप कर सकते हैं git clone git@github.com:username/repo.git

नोट: सत्यापित करें कि पहचानफाइल पर अनुमतियां 400 हैं। एसएसएसएच स्पष्ट रूप से स्पष्ट तरीके से अस्वीकार नहीं करेगा, एसएसएच कुंजी जो बहुत पठनीय हैं। यह सिर्फ एक क्रेडेंशियल अस्वीकृति की तरह दिखेगा। समाधान, इस मामले में है:

chmod 400 ~/.ssh/id_rsa_github

543
2018-01-12 19:36



क्या होगा यदि आपको अलग-अलग कुंजियों के साथ एक ही होस्ट से कनेक्ट करने की आवश्यकता है? - Valentin Klinghammer
@Quelltextfabrik - आप एक अलग होस्ट के साथ एक और अनुभाग जोड़ सकते हैं: nerderati.com/2011/03/... - Ben Challenor
@Cliff Nop, मेरे मैनपेज में: "HostName: लॉग इन करने के लिए असली होस्ट नाम निर्दिष्ट करता है। इसका उपयोग मेजबानों के लिए उपनाम या संक्षेप निर्दिष्ट करने के लिए किया जा सकता है। "मेरा एसएसएच संस्करण openssh-6.7p1 है। - Grissiom
@Grissiom यह वही है जो यह कहता है। लेकिन आप पीछे की ओर समझने लगते हैं। होस्ट (या मैच) आवश्यक है। एक होस्ट उपनाम बनाने के लिए आप होस्ट लाइन में उपनाम और होस्टनाम लाइन में असली होस्टनाम डालते हैं। उदाहरण: saltycrane.com/blog/2008/11/... - Cliff
अगर कॉन्फ़िगरेशन फ़ाइल नई है, तो करना न भूलें chmod 600 ~/.ssh/config - elysch


वातावरण विविधता GIT_SSH_COMMAND:

गिट संस्करण 2.3.0 से, आप पर्यावरण चर का उपयोग कर सकते हैं GIT_SSH_COMMAND इस तरह:

GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example" git clone example

ध्यान दें कि -i कभी-कभी आपकी कॉन्फ़िगरेशन फ़ाइल द्वारा ओवरराइड किया जा सकता है, इस मामले में, आपको एसएसएच को एक खाली कॉन्फ़िगरेशन फ़ाइल देना चाहिए, जैसे:

GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example -F /dev/null" git clone example

विन्यास core.sshCommand:

गिट संस्करण 2.10.0 से, आप इसे प्रति रेपो या वैश्विक रूप से कॉन्फ़िगर कर सकते हैं, इसलिए आपको पर्यावरण परिवर्तक को और भी सेट करने की आवश्यकता नहीं है!

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

238
2018-05-08 09:43



मुझे निर्यात करना पड़ा खोल इस काम को करने के लिए एक पर्यावरण चर के लिए परिवर्तनीय, यानी। export GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example", फिर git clone example - Abdull
@Abdull बैश में, उसी पंक्ति पर असाइनमेंट कर रहा है क्योंकि आदेश केवल उस कमांड के लिए पर्यावरण चर निर्यात करता है। कोशिश करो: example=hello /usr/bin/env | grep example। - Flimm
चीजें और भी बेहतर हो गई हैं: गिट 2.10 के रूप में, आप अपने गिट कॉन्फ़िगरेशन में कमांड स्टोर कर सकते हैं: stackoverflow.com/a/38474220/520162 - eckes
@Noitidart /dev/null यूनिक्स जैसे ऑपरेटिंग सिस्टम में केवल एक वैध फ़ाइल नाम है, यह विंडोज पर काम नहीं करता है। - Flimm
यदि आपको एकाधिक कुंजी की आवश्यकता है, तो -i पैरामीटर दोहराया जा सकता है, और एसएसएच बदले में प्रत्येक कुंजी को आजमाएगा। git config core.sshcommand "ssh -i /path/to/keyA -i /path/to/keyB"। यह गिट विभिन्न रिमोट होस्ट्स के साथ विभिन्न चाबियों का उपयोग करने देता है। - Mark


वहाँ है नहीं प्रत्यक्ष मार्ग बताने के लिए git उपयोग करने के लिए कौन सी निजी कुंजी, क्योंकि यह निर्भर करता है ssh भंडार प्रमाणीकरण के लिए। हालांकि, अभी भी आपके लक्ष्य को प्राप्त करने के कुछ तरीके हैं:

विकल्प 1: ssh-agent

आप उपयोग कर सकते हैं ssh-agent अस्थायी रूप से अपनी निजी कुंजी को अधिकृत करने के लिए।

उदाहरण के लिए:

$ ssh-agent sh -c 'ssh-add ~/.ssh/id_rsa; git fetch user@host'

विकल्प 2: GIT_SSH_COMMAND

का उपयोग कर एसएसएच तर्क पास करें GIT_SSH_COMMAND वातावरण विविधता (गिट 2.3.0+)।

उदाहरण के लिए:

$ GIT_SSH_COMMAND='ssh -i ~/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' \
  git clone user@host

आप इसे सब एक पंक्ति पर टाइप कर सकते हैं - अनदेखा करें $ और छोड़ दो \

विकल्प 3: GIT_SSH

का उपयोग कर एसएसएच तर्क पास करें GIT_SSH वैकल्पिक चर निर्दिष्ट करने के लिए पर्यावरण चर ssh द्विआधारी।

उदाहरण के लिए:

$ echo 'ssh -i ~/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no $*' > ssh
$ chmod +x ssh
$ GIT_TRACE=1 GIT_SSH='./ssh' git clone user@host

नोट: उपरोक्त रेखाएं खोल (टर्मिनल) कमांड लाइन हैं जिन्हें आपको अपने टर्मिनल में पेस्ट करना चाहिए। वे नाम की एक फाइल बना देंगे ssh, इसे निष्पादन योग्य बनाएं, और (परोक्ष रूप से) इसे निष्पादित करें।

ध्यान दें: GIT_SSH v0.99.4 के बाद उपलब्ध है (2005)।

विकल्प 4: ~/.ssh/config

उपयोग ~/.ssh/config अपनी निजी कुंजी के स्थान को निर्दिष्ट करने के लिए अन्य उत्तरों में सुझाए गए फ़ाइल, उदा।

Host github.com
  User git
  Hostname github.com
  IdentityFile ~/.ssh/id_rsa

70
2018-01-23 22:08



//, क्या होगा यदि एसएसएच एजेंट में आपकी पहचान अग्रेषित की गई है, हालांकि, इस प्रश्न में? superuser.com/questions/971732/... - Nathan Basanese
मैंने मुझे इस पोस्ट को दोबारा सुधारने की इजाजत दी है: आईएमओ यह अब तक का सबसे व्यापक जवाब है। अपने मूल डिजाइन में, एक त्वरित स्कैन ने उस पोस्ट का सुझाव दिया जहां समस्या के लिए एक जटिल समाधान का वर्णन किया गया, इसलिए मैंने इसे याद किया। - Alberto
$ ssh-agent sh -c 'ssh-add ~/.ssh/id_rsa; git fetch user@host' मेरे लिए काम नहीं किया जब कुछ और नहीं होगा। कुडोस। - Daniel Dewhurst
मुझे उपयोग करना पड़ा ~/.ssh/config विधि, env vars मेरे लिए काम नहीं किया ... - Greg Dubicki
GIT_SSH तब से उपलब्ध है v0.99.4 (अगस्त 2005), इसलिए मूल रूप से गिट मौजूद है (अप्रैल 2005)। - Dominik


कॉल करने वाली एक स्क्रिप्ट लिखें ssh आपके द्वारा इच्छित तर्कों के साथ, और स्क्रिप्ट का फ़ाइल नाम डालें $GIT_SSH। या बस अपनी कॉन्फ़िगरेशन डालें ~/.ssh/config


32
2018-01-12 18:25



एक और स्पष्टीकरण यह कैसे करें। - Sithsu
~/.ssh/config है  जाने के लिए रास्ता। - hek2mgl
मैं एक मशीन (ए) पर काम करता हूं जिसमें से मैं एक सर्वर (बी) को धक्का देता हूं जो केवल एसएसएच कुंजी प्रमाणीकरण स्वीकार करता है। जबकि मेरा ~ / .ssh / config सेटअप (ए) पर काम करता है जब मैं सीधे काम करता हूं पर वह मशीन, जब मैं किसी अन्य स्थान से लॉगिन नहीं करता (सी)। का उपयोग करते हुए $GIT_SSH और एक स्क्रिप्ट इस समस्या को हल किया। धन्यवाद! - bsumirak


यदि आप हर बार गिट चलाने के दौरान पर्यावरण चर निर्दिष्ट करना नहीं चाहते हैं, तो एक और रैपर स्क्रिप्ट नहीं चाहते हैं, एसएसएच एजेंट (1) नहीं चला सकते हैं, न ही इसके लिए एक और पैकेज डाउनलोड करना चाहते हैं, गिट का उपयोग करें -remote-ext (1) बाहरी परिवहन:

$ git clone 'ext::ssh -i $HOME/.ssh/alternate_id git.example.com %S /path/to/repository.git'
Cloning into 'repository'
(...)
$ cd repository
$ git remote -v
origin  ext::ssh -i $HOME/.ssh/alternate_id git.example.com %S /path/to/repository.git (fetch)
origin  ext::ssh -i $HOME/.ssh/alternate_id git.example.com %S /path/to/repository.git (push)

मैं इस समाधान को बेहतर मानता हूं क्योंकि:

  • यह भंडार / रिमोट विशिष्ट है
  • रैपर स्क्रिप्ट ब्लोट से बचें
  • एसएसएच एजेंट की आवश्यकता नहीं है - यदि आप अनुपयुक्त क्लोन / पुश / पुल चाहते हैं (उदाहरण के लिए क्रॉन में)
  • निश्चित रूप से, कोई बाहरी उपकरण की आवश्यकता नहीं है

15
2017-07-21 19:44



//, उत्कृष्ट समाधान। मुझे आश्चर्य है, हालांकि, अगर यह किसी को एजेंट अग्रेषण का उपयोग करके पारित पहचान निर्दिष्ट करने की अनुमति देगा। मेरी अधिकांश कुंजी उन सर्वरों के लिए स्थानीय नहीं हैं जिन पर मैं उनका उपयोग कर रहा हूं। मैंने यहां इसके बारे में पूछा: superuser.com/questions/971732/... - Nathan Basanese
उत्तर केवल गिट रिपॉजिटरीज़ के रूप में उपयोग किए जाने वाले मनमानी कमांड लाइनों को निर्दिष्ट करने के तरीके से संबंधित है। आईएमएचओ, आपको अकेले एसएसएच का उपयोग करके अपनी समस्या को हल करने का प्रयास करना चाहिए (उदा। "एसएसएच मेज़बान"सही कुंजी का उपयोग कर कनेक्ट करना चाहिए)। हालांकि, मैं आपके अन्य प्रश्न पर अधिक जानकारी प्रदान करने की कोशिश करूंगा। - flaviovs
यह जवाब बिल्कुल वही था जो मुझे शेफ को मजबूर करने के लिए आवश्यक था git संसाधन निजी गिटूब भंडारों से क्लोन / लाने के लिए भंडार-विशिष्ट तैनाती कुंजी का उपयोग करने के लिए संसाधन। पर्यावरण / स्क्रिप्ट आधारित पर इस विधि का अतिरिक्त लाभ यह है कि चूंकि कुंजी-पथ वर्किंग-रेपो की कॉन्फ़िगरेशन में एन्कोड किया गया है, इसलिए यह प्रारंभिक क्लोन और बाद के fetches / pushes दोनों पर एक ही कुंजी का उपयोग करेगा। - Adam Franco
वाह! यह बहुत अच्छा है, इस बारे में नहीं पता था। जवाब देने के लिए अतिरिक्त परेशानी को रोकने के लिए उत्तर के लिए धन्यवाद, कठपुतली वातावरण में काफी मददगार .ssh/config आदि +1! - gf_
यदि आपको निम्न त्रुटि आती है fatal: transport 'ext' not allowed, आपको के माध्यम से ext प्रोटोकॉल whitelist है export GIT_ALLOW_PROTOCOL=ext। असल में, गिट-रिमोट-एक्सटी रिमोट हेल्पर (जो "ext :: ssh example.com% s foo / repo" URL का समर्थन करता है) मनमाने ढंग से कमांड निष्पादन की अनुमति देता है। यह आमतौर पर कोई चिंता नहीं है क्योंकि उपयोगकर्ता हमेशा गिट को पास किए गए यूआरएल को देखता और भरोसा करता है। हालांकि, gitmodules फ़ाइल के माध्यम से गिट सबमिड्यूल, हमलावर को क्लाइंट से मनमाने ढंग से गिट यूआरएल लाने का अनुरोध करने की अनुमति देता है। hackerone.com/reports/104465 - Gomino


मेरे संघर्ष के बाद $GIT_SSH मैं साझा करना चाहता हूं कि मेरे लिए क्या काम करता है।

मेरे उदाहरणों के माध्यम से मैं मानता हूं कि आपकी निजी कुंजी स्थित है/home/user/.ssh/jenkins

बचने में त्रुटि: GIT_SSH मान में विकल्प शामिल हैं

$ export GIT_SSH="ssh -i /home/user/.ssh/jenkins"

या जो कुछ भी असफल हो जाएगा, जैसा कि गिट एक फ़ाइल के रूप में मान निष्पादित करने का प्रयास करेगा। इसी कारण से, आपको एक स्क्रिप्ट बनाना है।

$ GIT_SSH स्क्रिप्ट का कार्य उदाहरण /home/user/gssh.sh

निम्नानुसार स्क्रिप्ट लागू की जाएगी:

$ $GIT_SSH [username@]host [-p <port>] <command>

नमूना स्क्रिप्ट काम कर सकता है:

#!/bin/sh
ssh -i /home/user/.ssh/jenkins $*

ध्यान दें $* अंत में, यह इसका महत्वपूर्ण हिस्सा है।

यहां तक ​​कि सुरक्षित विकल्प, जो आपकी डिफ़ॉल्ट कॉन्फ़िगरेशन फ़ाइल (और स्पष्ट रूप से उपयोग करने के लिए पोर्ट का उल्लेख करते हुए) में किसी भी चीज़ के साथ किसी भी संभावित संघर्ष को रोक देगा:

#!/bin/sh
ssh -i /home/user/.ssh/jenkins -F /dev/null -p 22 $*

मान लीजिए कि स्क्रिप्ट है /home/user/gssh.sh, तो आप करेंगे:

$ export GIT_SSH=/home/user/gssh.sh

और सब काम करेंगे।


13
2018-05-28 17:09



धन्यवाद। बस ध्यान दें: तर्कों के माध्यम से $ * के बजाय "$ @" का उपयोग करें, क्योंकि जब तर्कों में सफेद जगह होती है तो पूर्व सही ढंग से व्यवहार करता है। - Piotr Findeisen
@PiotrFindeisen आपके नोट के लिए धन्यवाद। हालांकि, मैं इसे पूरी तरह से समझ नहीं पा रहा हूं - zsh में यह मुझे एक टुकड़े में अंतरिक्ष के साथ तार रखने में मदद करता है, लेकिन बाश में नहीं। क्या आप मुझे कुछ स्पष्टीकरण के बारे में बता सकते हैं या इंगित कर सकते हैं? मैं कुछ संशोधन को अंधाधुंध जोड़ना नहीं चाहता हूं। - Jan Vlcinsky
आपको अपने उत्तर के पहले भाग को हटा देना चाहिए। कोई भी ऐसे समाधान में रूचि नहीं रखता है जो काम नहीं करता है, और यह पढ़ना बर्बाद हो गया है जो नीचे दिए गए सही उत्तर को खराब करता है, जो आश्चर्यजनक रूप से काम करता है। - Cerin
@Cerin यदि आप "बचने में त्रुटि" को हटाने का मतलब है तो मैं इसे वहां रखने जा रहा हूं। यह टालने के लिए आम गड़बड़ी साझा करता है और यह बहुत छोटा है। मुझे यकीन है कि कोई भी सभी चीजों को परिवर्तनीय रूप से प्रदान करके समाधान को अनुकूलित करने का प्रयास करेगा (यह मेरे साथ हुआ), इसलिए मैंने सफलता के मार्ग को कम करने की कोशिश की। - Jan Vlcinsky


कस्टम होस्ट कॉन्फ़िगरेशन का उपयोग करें ~/.ssh/config, इस तरह:

Host gitlab-as-thuc  
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_rsa.thuc
    IdentitiesOnly yes

फिर इस तरह अपने कस्टम होस्टनाम का उपयोग करें:

git remote add thuc git@gitlab-as-thuc:your-repo.git  

7
2018-05-17 15:03



यही वह जवाब है जिसे मैं ढूंढ रहा था, क्योंकि मेरे पास घर और काम के लिए अलग गिटहब खाते हैं। मुझे बस सेट करना पड़ा Host work.github.com  HostName github.com  IdentityFile ~/.ssh/work, और फिर जब भी मैं एक कार्य भंडार क्लोन करता हूं तो "work.github.com" द्वारा "github.com" को प्रतिस्थापित करें। यह अभी भी "github.com" से जुड़ता है, लेकिन एक गैर-डिफ़ॉल्ट कुंजी जोड़ी का उपयोग कर रहा है। - Mikkel
विवरण के लिए यूआरएल ("itblog.study.land / ... ") अब और काम नहीं करता है :( - Carl Smotricz


आप अपने स्वयं के रैपर बनाने के बजाय एसएसएच-पहचान का उपयोग कर सकते हैं।

आप यहां और पढ़ सकते हैं:    https://github.com/ccontavalli/ssh-ident

जब पहली बार आवश्यकता होती है, तो यह कई मांग सत्रों, xterms या NFS साझा घरों के साथ मांग पर एसएसएच कुंजी लोड करता है।

एक छोटी कॉन्फ़िगरेशन फ़ाइल के साथ, यह स्वचालित रूप से अलग-अलग कुंजी लोड कर सकता है और आपको जो कुछ करने की आवश्यकता है उसके आधार पर उन्हें अलग-अलग एजेंटों (एजेंट अग्रेषण के लिए) में अलग रख सकता है।


5
2018-03-23 01:35





मेरे पास एक ग्राहक था जिसकी एक अलग जिथब खाता की आवश्यकता थी। तो मुझे सिर्फ एक परियोजना के लिए एक अलग कुंजी का उपयोग करने की आवश्यकता थी।

मेरा समाधान इसे मेरे .zshrc / .bashrc में जोड़ना था:

alias infogit="GIT_SSH_COMMAND=\"ssh -i ~/.ssh/id_specialkey\" git $@"

जब भी मैं उस परियोजना के लिए गिट का उपयोग करना चाहता हूं तो मैं गिट के साथ "infogit" को प्रतिस्थापित करता हूं:

infogit commit -am "Some message" && infogit push

मेरे लिए, याद रखना आसान है।


4
2018-03-26 19:26