एकाधिक गिटहब खाते और एसएसएच विन्यास


249

मुझे एक साथ खेलने के लिए दो अलग-अलग SSH कुंजी / GitHub खाते मिलने में कुछ परेशानी हो रही है। मेरे पास निम्न सेटअप है:

एक खाते के उपयोग से सुलभ पुन: उपयोग करें git@github.com:accountname

दूसरे खाते से पहुंच का उपयोग करके पुन: उपयोग करें git@github.com:anotheraccount

प्रत्येक खाते की अपनी SSH कुंजी होती है। दोनों SSH कुंजियाँ जोड़ी गई हैं और मैंने एक विन्यास फाइल बनाई है। मुझे विश्वास नहीं है कि कॉन्फ़िगर फ़ाइल सही है। मुझे पूरा यकीन नहीं है कि यह निर्दिष्ट करने के लिए कि उपयोग किए जा रहे रिपोज का उपयोग git@github.com:accountnameकरना चाहिए id_rsaऔर उपयोग करना git@github.com:anotheraccountचाहिए id_rsa_anotheraccount


मुझे यह लिंक मददगार मीडियम
jgreen

मेरी ~ / .sh / config में 3 अलग SSH पहचान हैं। स्कूल सर्वर के लिए पासकोड है; अलग काम / व्यक्तिगत GitHub accts के लिए 2 नहीं। git pullअलग-अलग आइडेंटिटी फाइल्स, "आइडेंटिटीऑनली = हां," अलग-अलग डोमेन और होस्टनाम के बावजूद, स्कूल पासकोड के लिए रनिंग फेल और पूछते रहे, सभी अलग-अलग मौजूद थे ssh-add -l... यूनी की उस सेटअप की परवाह किए बिना 'पहले' थी। अपने अनुभाग को दूसरों के .ssh / config से नीचे ले जाना था, और अब git pullदोनों GitHub accts से w / o को uni ssh पासवर्ड माँगना सफल होता है।
mc01

जवाबों:


309

एंडी लेस्टर की प्रतिक्रिया सटीक है लेकिन मुझे काम करने के लिए इसे बनाने के लिए आवश्यक एक महत्वपूर्ण अतिरिक्त कदम मिला। दो प्रोफाइल स्थापित करने की कोशिश में, एक व्यक्तिगत और एक काम के लिए, मेरा काम ~/.ssh/configलगभग इस प्रकार था:

Host me.github.com
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/me_rsa

Host work.github.com
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/work_rsa

जब तक मैंने काम नहीं किया तब तक मेरी कार्य प्रोफ़ाइल नहीं थी ssh-add ~/.ssh/work_rsa। उसके बाद गिथब के कनेक्शन ने सही प्रोफ़ाइल का उपयोग किया। पहले वे पहली सार्वजनिक कुंजी के लिए डिफ़ॉल्ट थे।

के लिए अपने प्रमाणीकरण एजेंट से कनेक्शन खोला नहीं जा सका का उपयोग करते समय ssh-add,
जाँच: https://stackoverflow.com/a/17695338/1760313


39
धन्यवाद! - वही ssh-addथा जो मुझे याद आ रहा था।
ऋषि

Ssh-add का उपयोग करके, मैं देख सकता था कि मेरे पास कुंजी सेट के लिए फ़ाइल अनुमति सही से नहीं है। एक बार मैंने तय किया कि सब कुछ काम किया। तो धन्यवाद!
फतमान

6
Doblock.com/articles/… भी देखें । जानकारी का मुख्य नया टुकड़ा यह है कि आपको दूरस्थ URL में होस्टनाम में उपयोगकर्ता नाम ("काम", इस उदाहरण में) जोड़ने की आवश्यकता हो सकती है, अर्थात, git@work.github.com: काम / my_repo.git (as "git@github.com ..." का विरोध)
BobS


15
इस समस्या को ठीक करने के लिए कि "वे पहले सार्वजनिक कुंजी में डिफ़ॉल्ट थे", अपनी फ़ाइल IdentitiesOnly yesके Host *अनुभाग में जोड़ें ~/.ssh/config। यह उन सभी के साथ सर्वर को स्पैम करने के बजाय आपके द्वारा निर्दिष्ट IdentityFiles का वास्तव में उपयोग करने के लिए ssh को बताता है।
मैकेनिकल घोंघा

172

मुझे हाल ही में ऐसा करना पड़ा था और इन सभी उत्तरों और उनकी टिप्पणियों के माध्यम से जानकारी को अंततः एक साथ मिलाना था, इसलिए मैं इसे एक पोस्ट में, आपकी सुविधा के लिए यहाँ रखूँगा:


चरण 1: ssh कुंजियाँ आपके
लिए आवश्यक कोई भी कुंजी बनाएँ। इस उदाहरण में मैंने मुझे डिफ़ॉल्ट / मूल 'id_rsa' (जो कि डिफ़ॉल्ट है) और मेरे नए 'id_rsa-work' का नाम दिया है:

ssh-keygen -t rsa -C "stefano@work.com"


चरण 2: ssh config ~ / .ssh / config
को संशोधित / संशोधित करके कई ssh प्रोफाइल सेट करें । थोड़ा भिन्न 'होस्ट' मानों पर ध्यान दें:

# Default GitHub
Host github.com
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa

# Work GitHub
Host work.github.com
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_work


चरण 3: ssh-add
आपको ऐसा करना पड़ सकता है या नहीं करना चाहिए। जाँच करने के लिए, पहचान की उंगलियों के निशान को चलाकर:

$ ssh-add -l
2048 1f:1a:b8:69:cd:e3:ee:68:e1:c4:da:d8:96:7c:d0:6f stefano (RSA)
2048 6d:65:b9:3b:ff:9c:5a:54:1c:2f:6a:f7:44:03:84:3f stefano@work.com (RSA)

यदि आपकी प्रविष्टियाँ नहीं हैं तो चलाएं:

ssh-add ~/.ssh/id_rsa_work


चरण 4: परीक्षण
आप यह सब सही ढंग से किया है परीक्षण करने के लिए, मैं निम्नलिखित त्वरित जांच का सुझाव देता हूं:

$ ssh -T git@github.com
Hi stefano! You've successfully authenticated, but GitHub does not provide shell access.

$ ssh -T git@work.github.com
Hi stefano! You've successfully authenticated, but GitHub does not provide shell access.

ध्यान दें कि आपको होस्टनाम (github / work.github) बदलना होगा जो इस बात पर निर्भर करता है कि आप किस कुंजी / पहचान का उपयोग करना चाहते हैं। लेकिन अब आप जाने के लिए अच्छा होना चाहिए! :)


1
यह एक शानदार प्रतिक्रिया है। मुझे कॉन्फ़िगर फ़ाइल का उपयोग करने के लिए दोनों ssh कुंजियों को जोड़ने के लिए ssh-add का उपयोग करना पड़ा .. धन्यवाद :)
gaurav.singharoy

केवल एक चीज जो मैं जोड़ना चाहता हूं वह यह है कि जब आप ssh-keygen -t rsa चलाते हैं, तो यह आपको एक डिफ़ॉल्ट फ़ाइल नाम देगा, यहीं पर आप अपना कस्टम फ़ाइल नाम दर्ज करते हैं।
डोनटो

सबसे अच्छे जवाबों में से एक। साथ ही इस वीडियो ने मेरी मदद की। youtube.com/watch?v=fnSRBRiQIU8&feature=youtu.be
TestWithArif

अच्छा पोस्ट, अच्छा होगा यदि इस पोस्ट में आपका git config 'ईमेल' सेट करना शामिल हो: help.github.com/articles/…
डेव इंजीनियर

43

मान लीजिए कि aliceएक github.com उपयोगकर्ता है, जिसमें 2 या अधिक निजी रिपॉजिटरी हैं repoN। इस उदाहरण के लिए हम सिर्फ दो नामित खजाने के साथ काम करेंगे repo1औरrepo2

https://github.com/alice/repo1

https://github.com/alice/repo2

आपको इन रिपॉजिटरी से एक सर्वर या एक से अधिक सर्वर पर पासवर्ड दर्ज किए बिना खींचने की आवश्यकता है। आप git pull origin masterउदाहरण के लिए प्रदर्शन करना चाहते हैं , और आप चाहते हैं कि पासवर्ड के लिए पूछे बिना ऐसा हो।

आप ssh- एजेंट के साथ व्यवहार करना पसंद नहीं करते हैं, आपने ~/.ssh/configएक फ़ाइल के बारे में पता लगाया है (या अब आप खोज रहे हैं) कि चलो अपने ssh क्लाइंट को पता है कि Hostname और यूज़रनेम के आधार पर उपयोग करने के लिए निजी कुंजी क्या है जो एक साधारण कॉन्फ़िगरेशन प्रविष्टि के साथ दिखती है यह:

Host github.com
  HostName github.com
  User git
  IdentityFile /home/alice/.ssh/alice_github.id_rsa
  IdentitiesOnly yes

तो आप आगे बढ़े और अपनी (alice_github.id_rsa, alice_github.id_rsa.pub)कीपियर बनाई , तो आप भी अपनी रिपॉजिटरी की .git/configफाइल में चले गए और आपने अपने रिमोट के url को originकुछ इस तरह से संशोधित किया :

[remote "origin"]
        url = "ssh://git@github.com/alice/repo1.git"

और अंत में आप रिपॉजिटरी Settings > Deploy keysसेक्शन में गए और की सामग्री जोड़ीalice_github.id_rsa.pub

इस बिंदु पर आप अपना git pull origin masterपासवर्ड बिना किसी समस्या के दर्ज कर सकते हैं ।

लेकिन दूसरे भंडार के बारे में क्या?

तो आपकी वृत्ति उस कुंजी को हथियाने के लिए होगी और उसे repo2'डिप्लॉय कीज' में जोड़ें , लेकिन github.com त्रुटि करेगा और आपको बताएगा कि कुंजी का उपयोग पहले से ही किया जा रहा है।

अब आप जाते हैं और एक अन्य कुंजी उत्पन्न करते हैं ( ssh-keygen -t rsa -C "alice@alice.com"बेशक पासवर्ड के बिना), और ताकि यह एक गड़बड़ न बने, अब आप अपना नाम इस तरह से लिखेंगे:

  • repo1 कुंजीयुग्म: (repo1.alice_github.id_rsa, repo1.alice_github.id_rsa.pub)
  • repo2 कुंजीयुग्म: (repo2.alice_github.id_rsa, repo2.alice_github.id_rsa.pub)

repo2अब आप github.com पर नई सार्वजनिक कुंजी को तैनात करेंगे, लेकिन अब आपके पास इससे निपटने के लिए एक ssh समस्या है।

Ssh यह कैसे बता सकता है कि किस रिपॉजिटरी को एक ही github.comडोमेन पर होस्ट करने के लिए किस कुंजी का उपयोग किया जाए ?

आपकी .ssh/configफ़ाइल इंगित करती है github.comऔर यह नहीं जानती है कि खींचने के समय कौन सी कुंजी का उपयोग करना है।

इसलिए मुझे github.com के साथ एक ट्रिक मिली। आप अपने ssh क्लाइंट को बता सकते हैं कि प्रत्येक रिपॉजिटरी एक अलग github.com सबडोमेन में रहती है, इन मामलों में, वे होंगे repo1.github.comऔरrepo2.github.com

तो पहली बात .git/configआपके रेपो क्लोन पर फ़ाइलों को संपादित करना है , इसलिए वे इसके बजाय इस तरह दिखते हैं:

रेपो 1 के लिए

[remote "origin"]
        url = "ssh://git@repo1.github.com/alice/repo1.git"

रेपो 2 के लिए

[remote "origin"]
        url = "ssh://git@repo2.github.com/alice/repo2.git"

और फिर, अपनी .ssh/configफ़ाइल पर, अब आप प्रत्येक उपडोमेन के लिए एक विन्यास दर्ज कर सकेंगे :)

Host repo1.github.com
  HostName github.com
  User git
  IdentityFile /home/alice/.ssh/repo1.alice_github.id_rsa
  IdentitiesOnly yes

Host repo2.github.com
  HostName github.com
  User git
  IdentityFile /home/alice/.ssh/repo2.alice_github.id_rsa
  IdentitiesOnly yes

अब आप git pull origin masterदोनों रिपॉजिटरी से कोई भी पासवर्ड डाले बिना सक्षम हैं ।

यदि आपके पास कई मशीनें हैं, तो आप प्रत्येक मशीन की चाबी कॉपी कर सकते हैं और उनका पुन: उपयोग कर सकते हैं, लेकिन मैं सलाह दूंगा कि आप प्रति मशीन 1 कुंजी और रेपो उत्पन्न करने के लिए पैर का काम करें। आपके पास संभालने के लिए और भी बहुत सी चाबियां होंगी, लेकिन अगर आप समझौता कर लेते हैं तो आप कम कमजोर होंगे।


1
होस्ट से मेल खाने वाले उपडोमेन को निर्दिष्ट करना .ssh/configमहत्वपूर्ण कदम है - इसके लिए बहुत बहुत धन्यवाद
माइक मिलर

22

मेरे पास जीथब पर 2 खाते हैं, और यहां मैंने linuxइसे काम करने के लिए (ऑन ) किया है।

चांबियाँ

  • Rsa कीज़ की 2 जोड़ी बनाएं ssh-keygen, उनके माध्यम से , उन्हें ठीक से नाम दें, ताकि जीवन आसान हो जाए।
  • स्थानीय एजेंट के माध्यम से निजी कुंजी जोड़ें ssh-add path_to_private_key
  • प्रत्येक गीथूब खाते के लिए, एक (अलग) सार्वजनिक कुंजी अपलोड करें।

विन्यास

~ / .Ssh / config

Host github-kc
    Hostname        github.com
    User git
    IdentityFile    ~/.ssh/github_rsa_kc.pub
    # LogLevel DEBUG3

Host github-abc
    Hostname        github.com
    User git
    IdentityFile    ~/.ssh/github_rsa_abc.pub
    # LogLevel DEBUG3

रेपो के लिए दूरस्थ url सेट करें:

  • मेजबान में रेपो के लिए github-kc:

    git remote set-url origin git@github-kc:kuchaguangjie/pygtrans.git
    
  • मेजबान में रेपो के लिए github-abc:

    git remote set-url origin git@github-abc:abcdefg/yyy.git
    

explaination

इसमें विकल्प ~/.ssh/config:

  • Hostgithub- <Ident_specific_user>
    होस्ट का कोई भी मूल्य हो सकता है जो होस्ट प्लस खाते की पहचान कर सके, इसके लिए वास्तविक होस्ट होने की आवश्यकता नहीं है, जैसे github-kc लिए मेरे स्थानीय लैपटॉप के लिए जीथब पर मेरे खाते में से एक की पहचान करें, आदि

    जब git रेपो के लिए दूरस्थ url सेट किया जाता है, तो इसे बाद में रखने का मान होता है, यह है git@कि रेपो मैप्स को किसी Host में कैसे लिखा जाता है।git remote set-url origin git@github-kc:kuchaguangjie/pygtrans.git


  • [निम्नलिखित उप विकल्प हैं Host]
  • Hostname
    वास्तविक होस्टनाम निर्दिष्ट करें, सिर्फ github.comजीथब के लिए उपयोग करें ,
  • Usergit
    उपयोगकर्ता हमेशा gitgitub के लिए है,
  • IdentityFile
    उपयोग करने के लिए कुंजी निर्दिष्ट करें, बस मार्ग को एक सार्वजनिक कुंजी रखें,
  • LogLevel
    डीबग करने के लिए लॉग स्तर निर्दिष्ट करें, यदि कोई समस्या, DEBUG3सबसे विस्तृत जानकारी देती है।


सुंदर - की जरूरत नहीं थी ssh-add path_to_private_key- शायद क्योंकि एजेंट को इस मामले में आवश्यक नहीं है। कॉन्फ़िगरेशन फ़ाइल कुंजियों के लिए पथ को स्पष्ट रूप से परिभाषित कर रही है।
मार्क चकेरियन

2
@MarkChackerian मुझे लगता है कि आपको इसकी आवश्यकता नहीं है ssh-addक्योंकि आपकी कुंजी पासवर्ड संरक्षित नहीं है (या यदि आप मैक पर हैं) तो OSX चाबी का गुच्छा आपके लिए इसे संभाल रहा है। ssh-addहर बार जब आप अपनी कुंजियों को एक्सेस करते हैं, तो आपको पासफ़्रेज़ दर्ज करने की आवश्यकता नहीं होती है।
अशर हसन

18

IdentityFileअपने में पैरामीटर का उपयोग करें ~/.ssh/config:

Host github.com
    HostName github.com
    IdentityFile ~/.ssh/github.rsa
    User petdance

धन्यवाद, लेकिन यह बिल्कुल सटीक नहीं है। मुझे जवाब मिल गया और नीचे साझा किया गया।
मूलांक

मुझे पूरा यकीन है कि मेरा दृष्टिकोण आपके मामले में काम करेगा। आप विभिन्न उपयोगकर्ताओं और विभिन्न पहचान फ़ाइलों की पहचान कर सकते हैं। बस विन्यास श्लोक पर प्रत्येक अलग मेजबान पैरामीटर देने की जरूरत है।
एंडी लेस्टर

1
एंडी, नीचे दिए गए लिंक के अनुसार मुझे मेजबान से .com ड्रॉप करने की आवश्यकता थी। एक बार मैंने किया कि यह ठीक काम करता है।
14

5

Ssh config फाइल (जैसा कि अन्य सभी उत्तरों में सुझाया गया है) को संपादित करने के लिए संभवतः एक सरल विकल्प, एक अलग (जैसे गैर-डिफ़ॉल्ट) ssh कुंजी का उपयोग करने के लिए एक व्यक्तिगत रिपॉजिटरी को कॉन्फ़िगर करना है।

रिपॉजिटरी के अंदर जिसके लिए आप एक अलग कुंजी का उपयोग करना चाहते हैं, चलाएं:

git config core.sshCommand 'ssh -i ~/.ssh/id_rsa_anotheraccount'

और सुनिश्चित करें कि, आपकी कुंजी ssh-agent में जोड़ी गई है, चलाकर:

ssh-add ~/.ssh/id_rsa_anotheraccount

ध्यान रखें कि ऊपर दिया गया कमांड आपके वर्तमान सत्र के लिए केवल ssh- एजेंट की कुंजी जोड़ेगा। यदि आप चाहते हैं कि यह हमेशा के लिए काम करे, तो आपको इसे स्थायी रूप से अपने ssh- एजेंट में जोड़ना होगा। जैसे यहाँ ubuntu और यहाँ OSX के लिए कैसे करना है ।

वैश्विक गिट कॉन्फ़िगरेशन और सशर्त का उपयोग करके कई रिपॉजिटरी में इस दृष्टिकोण को स्केल करना भी संभव होना चाहिए ( उदाहरण देखें )।


4

मेरे मामले में ऊपर दिए गए समाधानों में से कोई भी मेरी समस्या को हल नहीं करता है, लेकिन ssh-agent करता है। मूल रूप से, मैंने निम्न कार्य किया:

  1. नीचे दिखाए गए ssh-keygen का उपयोग करके मुख्य जोड़ी बनाएं। यह एक प्रमुख जोड़ी उत्पन्न करेगा (इस उदाहरण में ) .\keyfileऔर.\keyfile.pub

    ssh-keygen -t rsa -b 4096 -C "yourname@yourdomain" -f keyfile

  2. keyfile.pubगिट प्रदाता को अपलोड करें

  3. अपनी मशीन पर ssh- एजेंट शुरू करें (आप ps -ef | grep ssh-agentपहले से चल रहा है या नहीं यह देखने के लिए देख सकते हैं)
  4. ssh-add .\keyfileक्रेडेंशियल जोड़ने के लिए चलाएँ
  5. अब आप दौड़ सकते हैं git clone git@provider:username/project.git

4

मैंने सभी चरणों को समझने के लिए बहुत समय बिताया। तो चरण दर चरण वर्णन करें:

  1. उपयोग करके नई पहचान फ़ाइल बनाएँ ssh-keygen -t rsa। इसे एक विकल्प की तरह दें proj1.id_rsaऔर बिना किसी संदेह के मारा जाए क्योंकि आपको पासफ़्रेज़ की आवश्यकता नहीं है।
  2. इसमें नया अनुभाग जोड़ें .ssh/config:

    Host proj1.github.com
        HostName github.com
        PreferredAuthentications publickey
        IdentityFile ~/.ssh/proj1.id_rsa
    

पहले खंड को ध्यान में रखें और ध्यान दें कि proj1.github.comहम बाद में अनुभाग में वापस आ जाएंगे।

  1. एजेंट को ssh में पहचान जोड़ें ssh-add ~/.ssh/proj1.id_rsa
  2. जो मैंने पहली बार गड़बड़ किया था - अब जब आप एक प्रोज 1 रेपो को क्लोन करना चाहते हैं तो आप इसका उपयोग कर रहे हैं proj1.github.com(बिल्कुल कॉन्फिग फाइल से होस्ट)। git clone git@proj1.github.com

एक अच्छा ट्यूटोरियल।

मेजबानों के साथ गड़बड़ मत करो


बुर्ज के लिंक के लिए धन्यवाद! आपके पास एक टाइपो है: प्रमुख नाम id_rsa_proj1और proj1_id_rsaवास्तव में समान होना चाहिए। आप .git/configअपने जवाब के लिए ट्यूटोरियल से सेटिंग के बारे में भी भाग जोड़ सकते हैं ।
सीजर

आपके पास अभी भी एक टाइपो है: proj1.id_rsaबनामproj1_id_rsa
सीज़र

2

मैंनें इस्तेमाल किया,

Host github.com
   HostName github.com
   IdentityFile ~/.ssh/github_rsa
   User abc@gmail.com

यह ठीक है।

विभिन्न उपयोगकर्ता नाम के लिए अलग rsa कुंजी के लिए अपने .ssh / config फाइल में उपरोक्त सेटिंग का उपयोग करें।


2

@Stefano के उत्तर के पूरक के रूप में, -fकिसी अन्य खाते के लिए नई SSH कुंजी उत्पन्न करने के साथ कमांड का उपयोग करना बेहतर होता है।

ssh-keygen -t rsa -f ~/.ssh/id_rsa_work -C "your@mail.com"

चूंकि id_rsa_workफ़ाइल पथ में मौजूद नहीं है ~/.ssh/, और मैं इस फ़ाइल को मैन्युअल रूप से बनाता हूं, और यह काम नहीं करता है :(


2

मैंने इनसे निपटने के लिए जिस तकनीक का उपयोग किया है, उसे मैंने यहाँ पोस्ट किया है

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