Git के साथ उपयोग करने के लिए निजी कुंजी का चयन करें


84

मेरे पास 2 गिट सर्वर हैं जिनके लिए 2 अलग-अलग एसएसएच कुंजी की आवश्यकता होती है।

git clone user1@server1:blahblahblahउपयोग करता है ~/.ssh/id_rsa, लेकिन मुझे यह निर्दिष्ट करने की आवश्यकता है कि मैं जिस सर्वर से जुड़ रहा हूं, उसके आधार पर किस कुंजी का उपयोग करना है।

Git कमांड-लाइन पैरामीटर क्या काम करता है? (मैं लिनक्स चला रहा हूं।)




जवाबों:


60

यदि आप SSH के माध्यम से जुड़ रहे हैं, तो कुंजी को SSH पैरामीटर द्वारा नियंत्रित किया जाएगा, न कि गिट पैरामीटर द्वारा।

SSH ~/.ssh/configकॉन्फ़िगरेशन पैरामीटर के लिए फ़ाइल में दिखता है । उस फ़ाइल को संशोधित करें और इस तरह दो Git सर्वर के लिए IdentityFile प्रविष्टियाँ जोड़ें:

Host server1.whatever.com
  IdentityFile /path/to/key_1
Host server2.whatever.com
  IdentityFile /path/to/key_2

इस लेख में कुछ और विवरण हैं।


13
इस सवाल का जवाब नहीं दिया। सवाल यह है कि मैं इस पैरामीटर को कैसे दे सकता हूं, जब ssh प्राधिकरण को संभालता है?
केक्स

@Keks: आप git कमांड लाइन के माध्यम से ssh तर्क पास नहीं कर सकते । यह उत्तर वर्कअराउंड देता है। उदाहरण के लिए git.wiki.kernel.org/index.php/… उदाहरण के लिए, अन्य वर्कअराउड्स भी संभव हैं । ध्यान दें कि दृष्टिकोण भी ssh व्यवहार को संशोधित करने के लिए कमांड लाइन तर्कों का उपयोग नहीं करता है।
कैमरून स्किनर

12
यह सच है, हालांकि आपके मूल उत्तर ने सवाल का जवाब नहीं दिया। आप भी उपयोग कर सकते हैं ssh-agentऔर उपयोग कर सकते हैं ssh-addऔर फिर सिर्फ गिट का उपयोग कर सकते हैं । जब gsh ssh से जुड़ता है, तो कुंजी पहले से ही सक्षम है। आप देखते हैं, कई तरीके हैं, और आपका मूल उत्तर वास्तव में मदद नहीं करता है।
गत

यह एक लिंक केवल बहुत सुंदर जवाब है। क्या आप अपने उत्तर में लेख के प्रासंगिक बिट्स को संक्षेप में प्रस्तुत कर सकते हैं?
फ्लिम्स

@ नाम: सारांश जोड़ा गया।
कैमरन स्किनर

105

एक और संभावना है। वह सेट करना है core.sshCommand, जैसे;

git config --local core.sshCommand "/usr/bin/ssh -i /home/me/.ssh/id_rsa_foo"

वहाँ एक विशेष परिदृश्य है इस रणनीति विशेष रूप से उपयोगी है जब: है कि आप Github पर एकाधिक खाते जब है, सभी खातों के रूप में sshके रूप में Github के लिए git@github.comऔर इसे इस्तेमाल करता sshनिर्धारित करने के लिए जो Github उपयोगकर्ता आप कर रहे हैं कुंजी। इस मामले में न तो आप क्या चाहते हैं .ssh/configऔर न ही ssh-agentकरेंगे।

अद्यतन - जब तक आपके पास स्थानीय रिपॉजिटरी नहीं है, तब तक आप इसे नहीं चला सकते हैं, इसलिए यदि आप किसी दूरस्थ रिपॉजिटरी को क्लोन करने का प्रयास कर रहे हैं, तो आपको ड्रयूबी 18 के उत्तर के अनुसार कुंजी को मैन्युअल रूप से निर्दिष्ट करना होगा:

git clone -c core.sshCommand="/usr/bin/ssh -i /home/me/.ssh/id_rsa_foo" git@github.com:me/repo.git

एक बार जब आप रिपॉजिटरी को क्लोन कर लेते हैं तो आप इसे git configस्थायी रूप से सेट करने के लिए कमांड का उपयोग कर सकते हैं ।


8
यह चयनित उत्तर होना चाहिए। आवश्यक कॉन्फ़िगरेशन अच्छी तरह से रिपॉजिटरी में स्थानीयकृत है जो विभिन्न गिट सर्वरों तक पहुंचने के लिए अलग-अलग ssh कुंजी का उपयोग करने की आवश्यकता है। GitHub पर कई खातों के मामले में ~ / .ssh / config (और यहां तक ​​कि / आदि / मेजबानों को संशोधित करने की आवश्यकता नहीं है)।
mr.b

1
एक समस्या है, हालांकि: आप इसे कॉन्फ़िगर करने से पहले एक रेपो क्लोन नहीं कर सकते हैं, और इसे कॉन्फ़िगर करने के लिए, आपको इसे पहले क्लोन करना होगा। या, आप git initएक रेपो कर सकते हैं , सही ssh कमांड का उपयोग करने के लिए इसे स्थानीय रूप से कॉन्फ़िगर कर सकते हैं , और फिर "git क्लोन" के साथ केवल 1 की तुलना में एक रिमोट (3 चरण) जोड़ सकते हैं।
mr.b

3
रेपो को क्लोन करने के लिए, मैं नीचे GIT_SSH_COMMAND वातावरण चर सेट करके, @ Guss के समाधान का उपयोग करूंगा। लेकिन सामान्य उपयोग में मैं अपना समाधान पसंद करता हूं क्योंकि यह उस चर को फिर से निर्यात करने से बचता है जब मैं हर बार एक नया शेल शुरू करता हूं।
रिचर्ड स्मिथ

जीवन रक्षक! वहाँ कितने लोग दिखाते हैं कि कैसे उपयोग करना है। / ssh/config इसे सेट करने के लिए, और मैक के लिए ssh-Agent / ssh-add -K का उपयोग करें। एक साल से इसका उपयोग कर रहा था, लेकिन इसने अचानक नवीनतम पैच के साथ हाई सिएरा में काम करना बंद कर दिया। core.sshCommand ने तब काम किया जब बाकी सब विफल हो गया। धन्यवाद!
स्टीव

2
इस सुरुचिपूर्ण समाधान के लिए धन्यवाद। हालाँकि मैं सिर्फ यह बताना चाहता हूं कि core.sshCommand केवल git> = 2.10.0 के
slonepi

32

आम तौर पर, आप इसके लिए उपयोग करना चाहते हैं ~/.ssh/config। केवल उन सर्वरों के साथ जो आप उनके लिए उपयोग करना चाहते हैं, उनके साथ पेयर सर्वर एड्रेस को निम्न प्रकार से:

Host github.com
  IdentityFile ~/.ssh/id_rsa.github
Host heroku.com
  IdentityFile ~/.ssh/id_rsa.heroku
Host *
  IdentityFile ~/.ssh/id_rsa

Host *किसी भी सर्वर को दर्शाता है, इसलिए मैं इसका उपयोग करने ~/.ssh/id_rsaके लिए डिफ़ॉल्ट कुंजी के रूप में सेट करने के लिए उपयोग करता हूं ।


9
यदि आपके पास GitHub जैसे एक सर्वर पर कई खाते हैं, और आप प्रत्येक के लिए एक अलग निजी कुंजी चाहते हैं तो यह विचार काम नहीं करता है।
फ्लिम

एक सर्वर पर कई खातों के लिए यह उत्तर देखें stackoverflow.com/questions/3225862/…
lexicalscope

23

मेरे परिदृश्य में, @ रिचार्ड स्मिथ परिदृश्य (जिसका समाधान, BTW, मेरे लिए काम नहीं करता) के समान, मुझे अलग-अलग रिपॉजिटरी के तहत एक ही सर्वर के लिए अलग-अलग कुंजी का उपयोग करने की आवश्यकता है।

मेरे लिए वर्कअराउंड सत्र को पर्यावरण चर के साथ सही ढंग से स्थापित करना था GIT_SSH_COMMAND, जैसे:

export GIT_SSH_COMMAND="ssh -o IdentitiesOnly=yes -i ~/.ssh/my-secret-identitiy"

अपडेट :

यहाँ एक और बात ध्यान देने योग्य है कि पर्यावरण चर को सही ढंग से सेट करना एक हलचल हो सकती है, इसलिए मैं लिक्विड प्रॉम्प्ट या फिश शेल जैसी चीजों द्वारा प्रदान की जाने वाली कमांड प्रॉम्प्ट मॉडिफिकेशन सुविधाओं का उपयोग शेल में हुक करने के लिए कर रहा हूं और पर्यावरण चर के अनुसार अद्यतन करता रहूं वर्तमान निर्देशिका और कुछ नियम। उदाहरण के लिए, Gitlab के साथ मेरी व्यक्तिगत SSH कुंजी की आवश्यकता वाली मेरी सभी व्यक्तिगत परियोजनाएँ तब होती हैं ~/Documents/Projects/personalजब शेल हुक चलता है pwdऔर पाता है कि वर्तमान निर्देशिका उस पथ के अंतर्गत है, यह स्वचालित GIT_SSH_COMMANDरूप से आवश्यकतानुसार चर सेट करता है।


15

ssh-add path-to-private-keyयह बॉक्स से बाहर काम करता है का उपयोग करें ।


5
यदि आपके पास दो तैनात कुंजियाँ नहीं हैं और वे केवल एक निश्चित रिपॉजिटरी के साथ काम करते हैं। उस स्थिति में, यह गलत कुंजी का उपयोग कर सकता है और कह सकता है कि आपके पास पहुंच नहीं है।
cdmckay

मैं इस समस्या cdmckay कहा गया
Suge

7

आप --global या --local कॉन्फ़िगरेशन सेट कर सकते हैं, वैश्विक ~/.gitconfigफ़ाइल अपडेट करेगा , स्थानीय रिपॉजिटरी में कॉन्फ़िगरेशन अपडेट करेगा .git/configऔर वैश्विक (~ / .itconfig) कॉन्फ़िगरेशन को ओवरराइड करेगा।

git config --local --add core.sshCommand 'ssh -i ~ / .ssh / my_key'


2
एक आकर्षण के रूप में काम किया, यह वही था जो मुझे चाहिए था, एक विशिष्ट रेपो के लिए एक समाधान।
क्वासिस्टर ल्युसम

6

यहाँ विंडोज उपयोगकर्ता, मैं अभी इस मुद्दे पर भागा हूं और थोड़ा अलग समाधान है फिर मैंने अब तक यहां पढ़ा है। मेरे सामने जो समस्या है वह यह है कि मैं बस एक विशिष्ट निजी ssh कुंजी का उपयोग करके एक रेपो क्लोन करना चाहता था और विश्व स्तर पर अपने git config को कॉन्फ़िगर करने या विशिष्ट git bash सेटिंग्स को जोड़ने की आवश्यकता नहीं है, क्योंकि मैं PowerShell में अपना काम करता हूं। अनिवार्य रूप से मैं बस कुछ निजी कुंजियों को अपने .ssh फ़ोल्डर में रखना चाहता हूं और मैं उन्हें आवश्यक रिपॉजिट में संदर्भित करता हूं।

इसके लिए निम्नलिखित कमांड काम करती है:

git clone -c core.sshCommand="ssh -i ~/.ssh/<PRIVATE KEY NAME>" <CLONE URL>

अनिवार्य रूप से यह क्या करता है git रेपो के आरंभीकरण पर यह क्लोन चलाने से पहले core.sshCommand विकल्प सेट करता है। तो आप इस रेपो के लिए जिस विशिष्ट ssh कुंजी का उपयोग करना चाहते हैं, वह केवल इस रेपो के लिए सेट है। यह सभी मामलों के लिए एक आदर्श समाधान नहीं हो सकता है लेकिन मैं जो चाहता हूं उसके लिए है।


धन्यवाद। मुझे इस -cविकल्प के बारे में पता नहीं था git clone। यह पर्यावरण को स्थापित करने से बेहतर है जैसा कि मैं सुझाव देता हूं कि क्लोनिंग करते समय।
रिचर्ड स्मिथ

1

अन्य उत्तरों ने मुझे एक छोटी सी स्क्रिप्ट लिखने के लिए प्रेरित किया, जो कमांड लाइन विकल्पों या (यदि वर्तमान में) git रिमोट -v के मानों के आधार पर ssh कुंजी चुनती है। आशा है कि इससे सहायता मिलेगी!

वास्तव में प्रश्न का उत्तर देने के लिए: गैट का उपयोग करें।

Https://bitbucket.org/eikerobert/gat/src/master/ भी देखें

#!/bin/bash

usegat=false

for VAR in "$@"
do
    if [ "$VAR" != "${VAR/git@bitbucket.org:myaccount/}" ]; then
        usegat=true
    fi
done

if [ $usegat=false ]; then
   /usr/bin/git rev-parse --is-inside-work-tree >/dev/null 2>&1
   isinsidegitrepo=$?
    #echo $isinsidegitrepo
   if [ $isinsidegitrepo = 0 ]; then
       remote=`/usr/bin/git remote -v`
       if [ "$remote" != "${remote/git@bitbucket.org:myaccount/}" ]; then
           usegat=true
       fi
   fi
fi


if [ $usegat = true ]; then
    # echo "TRUE"
    /usr/bin/git -c core.sshCommand="/usr/bin/ssh -i /home/myaccount/.ssh/mykey" "$@"
else
     #echo "FALSE"
    /usr/bin/git "$@"
fi

1

एक अन्य विकल्प यह है कि थोड़ी सी होशियारी करने के लिए एक छोटी सी स्क्रिप्ट लिखी जाए core.sshCommand- जाँच करें कि क्या वर्तमान वर्किंग डायरेक्टरी में एक विशिष्ट SSH कुंजी कॉन्फ़िगर की गई है और यदि ऐसा है तो उसका उपयोग करें, अन्यथा - मानक SSH कुंजी रिज़ॉल्यूशन पर भरोसा करें।

यहाँ मेरा पहला संस्करण है:

#!/bin/bash
key="$(git config ssh.key)"
if [ -n "$key" ]; then
        ssh -o IdentitiesOnly=yes -i "$key" "$@"
else
        ssh "$@"
fi

फिर इसे वैश्विक git SSH कमांड के रूप में सेट करें :

chmod 755 ~/.local/bin/git-ssh-command
git config --global core.sshCommand ~/.local/bin/git-ssh-command

( SystemD ऑपरेटिंग सिस्टम पर "यहाँ उपयोगकर्ता स्क्रिप्ट्स के~/.local/bin लिए वर्तमान मानक है " )

इसे सेट करने के बाद, आप कॉन्फ़िगरेशन विकल्प सेट करके किसी विशिष्ट SSH कुंजी का उपयोग करने के लिए किसी भी रिपॉजिटरी को कॉन्फ़िगर कर सकते हैं ssh.key:

git config --local ssh.key ~/.ssh/my-non-default-private-key

अतिरिक्त वैकल्पिक ट्रिक्स

  • ssh.key"नॉन-डिफॉल्ट SSH कुंजी" या कुछ और करने के लिए वैश्विक डिफ़ॉल्ट सेट करें ।
  • जैसे core.sshCommandकि रिपॉजिटरी की रूट डायरेक्टरी में git निष्पादित होता है, आपका कस्टम git-ssh-commandउस पर गौर कर सकता है और निर्देशिका नामों के बारे में कुछ अनुमान लगा सकता है। यह elseअनुभाग में किया जा सकता है, इसलिए यदि केवल कोई विशिष्ट कुंजी नहीं है तो उत्तराधिकार में किक लगाई जाती है ssh.key
  • आप git remote -vरीमेक के आधार पर हेयिस्टिक्स को जोड़ने के लिए चेक जोड़ सकते हैं , जैसे कि ईक की स्क्रिप्ट में
  • यदि आप रिपॉजिटरी रीमोट्स को देखना चाहते हैं, लेकिन कई रिमूवर हैं जिनकी अलग-अलग कुंजियों की जरूरत है, तो आप remote="$1:$(sed "s,.* ,,;s,',,g"<<<"$2")"स्क्रिप्ट की शुरुआत में रिमोट द्वारा संचालित किए जा रहे समाधान को जोड़ सकते हैं - और उसके खिलाफ जांच ( आउटपुट $remoteमें मध्य कॉलम की तरह दिखेंगे git remote -v)।

अपडेट करें:

यहां कस्टम SSH कमांड का एक संस्करण है जो दूरस्थ URL को देखता है और कुछ उत्तराधिकार करता है - मेरे मामले में, मेरे पास एक ही सार्वजनिक गिट होस्टिंग सेवा (काम के लिए एक, व्यक्तिगत के लिए एक) और मैं चुन सकता हूं। दूरस्थ URL (Gitlab समूह या Github संगठन, आदि की जांच) को देखकर सही पहचान:

#!/bin/bash
if [[ "$2" =~ ^git-lfs-authenticate.* ]]; then # reconstruct url for git-lfs
        remote="$1:$(awk '{print$2}'<<<"$2")"
else # reconstruct url for standard git commands
        remote="$1:$(sed "s,.* ,,;s,',,g"<<<"$2")"
fi
#echo "Detected $remote from $@" >&2 # optional debug log
key="$(git config ssh.key)"
if [ -n "$key" ]; then # use specified SSH key, if set
        ssh -o IdentitiesOnly=yes -i "$key" "$@"
elif [[ "$remote" == git@gitlab.com:my-company* ]]; then # use company id
        ssh -o IdentitiesOnly=yes -i ~/.ssh/company-id "$@"
elif [[ "$remote" =~ git@bitbucket.org:.*other-org.* ]]; then # bitbucket has weird urls
        ssh -o IdentitiesOnly=yes -i ~/.ssh/custom-org-key "$@"
else # otherwise use whatever the agent has (my personal key)
        ssh "$@"
fi
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.