एक ग्राहक पर कई SSH निजी कुंजी का उपयोग करने का सबसे अच्छा तरीका है


869

मैं एक ही सर्वर के विभिन्न सर्वरों या विभिन्न भागों से जुड़ने के लिए कई निजी कुंजियों का उपयोग करना चाहता हूं (मेरे उपयोग सर्वर के सिस्टम प्रशासन, गिट के प्रशासन और एक ही सर्वर के भीतर सामान्य गिट उपयोग) हैं। मैं बस id_rsaफ़ाइलों में कोई फायदा नहीं हुआ में चाबियाँ स्टैकिंग की कोशिश की ।

जाहिर है ऐसा करने का एक सीधा तरीका है कमांड का उपयोग करना

ssh -i <key location> login@server.example.com 

जो काफी बोझिल है।

किसी भी सुझाव के रूप में कैसे के बारे में जाने के लिए यह थोड़ा आसान है?


1
मैंने यह लेख लिखा जो विभिन्न विन्यासों और उनकी ताकत / कमियों पर गहराई से जाता है।
रफी

जवाबों:


1233

मेरे से .ssh/config:

Host myshortname realname.example.com
    HostName realname.example.com
    IdentityFile ~/.ssh/realname_rsa # private key for realname
    User remoteusername

Host myother realname2.example.org
    HostName realname2.example.org
    IdentityFile ~/.ssh/realname2_rsa  # different private key for realname2
    User remoteusername

और इसी तरह।


24
धन्यवाद रान्डल! मैंने .ssh / config में कुछ खुदाई की और यह पाया: github.com/guides/multiple-github-accounts ने मुझे सही दिशा में इंगित किया
जस्टिन

6
यह एक बड़ी मदद थी ( स्टैकओवरफ्लो के अलावा / एक / 3828682/169153 )। : यदि आप उपयोग करना चाहते हैं पोटीन कुंजी यहाँ इस दस्तावेज़ का पालन blog.padraigkitterick.com/2007/09/16/...
Urda

2
मुझे यह पोस्ट बहुत मददगार लगी। कॉन्फ़िगरेशन फ़ाइल बनाते समय मैंने जो एक त्रुटि की थी, वह थी कि मैं एक .txt फ़ाइल को एक कॉन्फ़िगर फ़ाइल बनाने के लिए "टच" कमांड चलाने के बजाय .ssh फ़ोल्डर में डाल दूं।
M_x_r

53
ध्यान दें कि आप IdentityFileउसी के लिए कई प्रविष्टियाँ भी निर्दिष्ट कर सकते हैं Host, जिन्हें कनेक्ट करते समय क्रम में आज़माया जाता है।
sschuberth

12
IdentitiesOnly yes~ / .Ssh / id_rsa या किसी अन्य पहचान को रोकने के लिए उपयोग करें । (यह मूल रूप से एक संपादन था)
user3338098

369

जब आप कनेक्ट करते समय उत्तराधिकार में कई कुंजी आज़माने के लिए ssh को निर्देश दे सकते हैं। ऐसे:

$ cat ~/.ssh/config
IdentityFile ~/.ssh/id_rsa
IdentityFile ~/.ssh/id_rsa_old
IdentityFile ~/.ssh/id_ed25519
# ... and so on

$ ssh server.example.com -v
....
debug1: Next authentication method: publickey
debug1: Trying private key: /home/example/.ssh/id_rsa
debug1: read PEM private key done: type RSA
debug1: Authentications that can continue: publickey
debug1: Trying private key: /home/example/.ssh/id_rsa_old
debug1: read PEM private key done: type RSA
....
[server ~]$

इस तरह से आपको यह बताने की जरूरत नहीं है कि कौन सी कुंजी किस सर्वर के साथ काम करती है। यह सिर्फ पहली कार्य कुंजी का उपयोग करेगा।

इसके अलावा, आप केवल एक पासफ़्रेज़ दर्ज करेंगे यदि किसी दिए गए सर्वर को कुंजी स्वीकार करने के लिए तैयार है। जैसा कि ऊपर ssh ने देखा है, .ssh/id_rsaभले ही उसके पास एक पासवर्ड के लिए पूछने की कोशिश न की गई हो ।

निश्चित रूप से यह अन्य उत्तरों की तरह एक प्रति-सर्वर कॉन्फ़िगरेशन को आगे नहीं बढ़ाता है, लेकिन कम से कम आपको उन सभी और हर सर्वर के लिए कॉन्फ़िगरेशन जोड़ना नहीं पड़ेगा, जिनसे आप कनेक्ट होते हैं!


12
यह पूछे गए प्रश्न के लिए एक शानदार समाधान है, लेकिन यह उन आवश्यकताओं को पूरा नहीं करता है जो पूछने वाले का इरादा था। मेरे लिए, यह बिल्कुल सही समाधान था और यह पूरी तरह से "एक ग्राहक पर कई एसएसएच निजी कुंजी का उपयोग करने का सबसे अच्छा तरीका" की आवश्यकता को पूरा करता है।
वेड

2
यह कॉन्फ़िगरेशन फ़ाइल में होस्ट घोषणा के तहत काम नहीं करता है
मक्सिम लुज़िक

29
यह git के साथ अच्छी तरह से काम नहीं करता है, जैसे कि आपके पास दो github परिनियोजित कुंजियाँ हैं, सूची में पहला वैध है और काम करेगा, लेकिन तब github शिकायत करेगा कि रिपॉजिटरी मेल नहीं खाती है।
एडम रीस

यह एक अधिक गतिशील दृष्टिकोण है, कुछ स्थितियों में महान काम करता है। इसके लिए धन्यवाद
gbolo

7
जागरूक रहें यदि आपके पास उन सर्वरों पर fail2ban जैसा कुछ है। आप उन जेलों में से एक में समाप्त हो सकते हैं ... क्योंकि अन्य कुंजियों से उत्पन्न विफल प्रयासों के कारण ...
पिकोलो

254

रैंडल श्वार्ट्ज से जवाब लगभग मुझे सभी तरह की मदद की। मेरे पास सर्वर पर एक अलग उपयोगकर्ता नाम है, इसलिए मुझे अपनी फ़ाइल में उपयोगकर्ता कीवर्ड जोड़ना पड़ा :

Host           friendly-name
HostName       long.and.cumbersome.server.name
IdentityFile   ~/.ssh/private_ssh_file
User           username-on-remote-machine

अब आप दोस्ताना-नाम का उपयोग करके जुड़ सकते हैं:

ssh friendly-name

OpenSSH मैन पेज पर अधिक कीवर्ड पाए जा सकते हैं । नोट: सूचीबद्ध कुछ कीवर्ड आपके / etc / ssh / ssh_config फ़ाइल में पहले से मौजूद हो सकते हैं ।


अगर मैं उस उपयोगकर्ता से गलती नहीं कर रहा हूँ जिसे आप आमतौर पर सीधे यूआरएल में निर्दिष्ट करते हैं, जब उपयोगकर्ता @ होस्ट के साथ
जुड़ता है

3
मैं 'पोर्ट' कीवर्ड का भी उपयोग करना पसंद करता हूं। एक और दिलचस्प कीवर्ड 'StrictHostKeyChecking' है।
ईथन

119

पिछले उत्तरों ने कई ssh कुंजियों के प्रबंधन के लिए विन्यास फाइल बनाने का तरीका ठीक से समझाया है। मुझे लगता है, जिस महत्वपूर्ण बात की भी व्याख्या करने की आवश्यकता है, वह है रिपॉजिटरी को क्लोन करते हुए एक अन्य नाम के साथ एक होस्ट नाम का प्रतिस्थापन

मान लीजिए, आपकी कंपनी के GitHub खाते का उपयोगकर्ता नाम abc1234 है । और मान लीजिए कि आपके व्यक्तिगत GitHub खाते का उपयोगकर्ता नाम jack1234 है

और, मान लें कि आपने दो RSA कुंजियाँ बनाई हैं, अर्थात् id_rsa_company और id_rsa_personal । तो, आपकी कॉन्फ़िगरेशन फ़ाइल नीचे की तरह दिखाई देगी:

# Company account
Host company
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_company

# Personal account
Host personal
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_personal

अब, जब आप कंपनी के GitHub खाते से रिपॉजिटरी (नामित डेमो) का क्लोन कर रहे हैं , तो रिपॉजिटरी URL कुछ इस तरह होगा:

Repo URL: git@github.com:abc1234/demo.git

अब, करते समय git clone, आपको ऊपर दिए गए रिपॉजिटरी URL को संशोधित करना चाहिए:

git@company:abc1234/demo.git

ध्यान दें कि कैसे github.com को अब "कंपनी" के साथ बदल दिया गया है जैसा कि हमने कॉन्फ़िगरेशन फ़ाइल में परिभाषित किया है।

सिमिलरी, आपको कॉन्फ़िगरेशन फ़ाइल में दिए गए उपनाम के आधार पर व्यक्तिगत खाते में रिपॉजिटरी के क्लोन URL को संशोधित करना होगा।


10
काश, मैं इस उत्तर को एक से अधिक बार अपटूडेट कर सकता ... इस मुद्दे पर संपर्क करने का यह सही तरीका है, और यह अन्य विकल्पों की तुलना में सुरक्षित और तेज है। अधिक स्केलेबल भी (एक ही होस्टनाम के लिए अलग-अलग कुंजियों को परिभाषित करने की अनुमति देता है )
मसराद

4
कोई और अधिक समय बर्बाद करें, यह उत्तर है। बहुत धन्यवाद।
लुइस मिलानी

2
मैं वास्तव में चाहता हूँ कि मुझे यह उत्तर पहले मिले ... लेकिन पहले से कहीं बेहतर देर, बहुत धन्यवाद!
हल्दी

2
महान व्याख्या! मेरे लिए एकदम सही काम करता है। और यदि आप उपनाम के साथ रेपो को क्लोन करना भूल गए हैं तो आप अक्सर मूल के दूरस्थ यूआरएल को बाद में संपादित कर सकते हैं।
tkahn

1
केवल भुगतान करें क्योंकि कॉन्फिगरेशन फाइल होनी चाहिए (chmod 600)
क्रिस्टियानो माटोस

105
foo:~$ssh-add ~/.ssh/xxx_id_rsa

सुनिश्चित करें कि आप इसे जोड़ने से पहले इसका परीक्षण करते हैं:

ssh -i ~/.ssh/xxx_id_rsa username@example.com

यदि आपको कभी-कभी त्रुटियों के साथ कोई समस्या होती है, तो फ़ाइल की सुरक्षा को बदलने में मदद मिलती है:

chmod 0600 ~/.ssh/xxx_id_rsa

4
यह मेरी राय में सबसे रसीला और सुरुचिपूर्ण समाधान है। एक जादू की तरह काम किया!
आर्टूर

@ याकूब आप इसे अपने बैश आर्क या बैश_प्रफाइल (या जो भी मैक समतुल्य है) में डाल सकते हैं?
T0xicCode


मेरे लिए एक आकर्षण की तरह काम किया (और लगभग 0600 परमिट मत भूलना)।
Dmytro Uhnichenko

1
मैक पर ubuntu से आया था और यह वही था जो मुझे चाहिए था।
हरिओम

42
  1. SSH कुंजी उत्पन्न करें:

    $ ssh-keygen -t rsa -C <email1@example.com>
    
  2. उत्पन्न करें another SSH key:

    $ ssh-keygen -t rsa -f ~/.ssh/accountB -C <email2@example.com>
    

    अब, दो सार्वजनिक कुंजी ( id_rsa.pub , accountB.pub ) को ~/.ssh/निर्देशिका में मौजूद होना चाहिए ।

    $ ls -l ~/.ssh     # see the files of '~/.ssh/' directory 
    
  3. ~/.ssh/configनिम्नलिखित सामग्री से कॉन्फिग फाइल बनाएँ :

    $ nano ~/.ssh/config
    
    Host bitbucket.org  
        User git  
        Hostname bitbucket.org
        PreferredAuthentications publickey  
        IdentityFile ~/.ssh/id_rsa  
    
    Host bitbucket-accountB  
        User git  
        Hostname bitbucket.org  
        PreferredAuthentications publickey  
        IdentitiesOnly yes  
        IdentityFile ~/.ssh/accountB  
    
  4. defaultखाते से क्लोन ।

    $ git clone git@bitbucket.org:username/project.git
    
  5. accountBखाते से क्लोन ।

    $ git clone git@bitbucket-accountB:username/project.git
    

यहाँ और देखें


24

मैं Tuomas के साथ ssh- एजेंट का उपयोग करने के बारे में सहमत होगा। मैं काम के लिए दूसरी निजी कुंजी भी जोड़ना चाहता था और इस ट्यूटोरियल ने मेरे लिए एक आकर्षण की तरह काम किया।

चरण इस प्रकार हैं:

  1. $ ssh-agent bash
  2. $ ssh-add /path.to/private/key जैसे ssh-add ~/.ssh/id_rsa
  3. द्वारा सत्यापित करें $ ssh-add -l
  4. इसे $ssh -v <host url>उदाहरण के साथ परखेंssh -v git@assembla.com

4
ssh-agentवर्षों से उपयोग करने के बाद , मैंने हाल ही में gnome-keyringअपने i3wm के भीतर Gnome का उपयोग करने के लिए स्विच किया है । कारण सरल है: गनोम कीरिंग प्रबंधक स्वचालित रूप से मेरे बिना ssh कीज़ को जोड़ने और हटाने का काम करता है ssh-add। इसके अलावा मुझे उन्हें अनलॉक करने के लिए एक एकल पासवर्ड प्रदान करना (और सुरक्षा के लिए एक निर्दिष्ट समय पर टाइमआउट)। हर किसी का अपना। चूंकि मैं आर्क पर सूक्ति सेटिंग्स का उपयोग करता हूं, यह मेरे सेटअप के साथ प्लग एन प्ले था। यदि आप एंटी-ग्नोम हैं, तो इस टिप्पणी को अनदेखा करें।
eduncan911

@ eduncan911, मैं मानता हूं कि सूक्ति-कीरिंग सहायक हो सकती है, लेकिन यह वास्तव में ed25519 कुंजी को संभालती नहीं है, इसलिए कि मेरे लिए एक गैर-स्टार्टर है। अद्यतन: मैं wiki.archlinux.org/index.php/GNOME/… से देखता हूं कि यह अब सिस्टम के ssh- एजेंट का उपयोग करता है ताकि अब कोई समस्या न हो।
ब्रायन मिंटन

15

मैं इस मुद्दे पर कुछ समय पहले चला था, जब मेरे पास दो बिटबकेट खाते थे और दोनों के लिए अलग-अलग एसएसएच कुंजी स्टोर करना चाहते थे। इसी से मेरा काम बना है।

मैंने दो अलग ssh कॉन्फ़िगरेशन निम्नानुसार बनाए।

Host personal.bitbucket.org
    HostName bitbucket.org
    User git
    IdentityFile /Users/username/.ssh/personal
Host work.bitbucket.org
    HostName bitbucket.org
    User git
    IdentityFile /Users/username/.ssh/work

अब जब मुझे अपने कार्य खाते से एक रिपॉजिटरी क्लोन करना था - कमांड इस प्रकार थी।

git clone git@bitbucket.org:teamname/project.git

मुझे इस आदेश को संशोधित करना था:

git clone git@**work**.bitbucket.org:teamname/project.git

इसी तरह मेरे व्यक्तिगत खाते से क्लोन कमांड को संशोधित किया जाना था

git क्लोन git @ personal .bitbucket.org: नाम / personalproject.git

देखें इस लिंक अधिक जानकारी के लिए।



11

अब, git के हालिया संस्करण के साथ, हम sshCommand को रिपॉजिटरी विशिष्ट git config फाइल में निर्दिष्ट कर सकते हैं ।

  [core]
      repositoryformatversion = 0
      filemode = true
      bare = false
      logallrefupdates = true
      sshCommand = ssh -i ~/.ssh/id_rsa_user   
   [remote "origin"]
      url = git@bitbucket.org:user/repo.git
      fetch = +refs/heads/*:refs/remotes/origin/*

1

महत्वपूर्ण: आपको ssh- एजेंट शुरू करना चाहिए

Ssh-add का उपयोग करने से पहले आपको ssh-Agent (यदि यह पहले से ही नहीं चल रहा है) शुरू करना चाहिए:

eval `ssh-agent -s` # start the agent

ssh-add id_rsa_2 # where id_rsa_2 is your new private key file

ध्यान दें कि eval कमांड विंडो पर GIT बैश पर एजेंट को शुरू करता है। अन्य वातावरण SSH एजेंट को शुरू करने के लिए एक प्रकार का उपयोग कर सकते हैं।


1

आप configअपने ~/.sshफ़ोल्डर में नाम की एक विन्यास फाइल बना सकते हैं । इसमें शामिल हो सकते हैं:

Host aws
    HostName *yourip*
    User *youruser*
    IdentityFile *idFile*

यह आपको इस तरह मशीनों से कनेक्ट करने की अनुमति देगा

 ssh aws

1

Ubuntu 18.04 पर कुछ नहीं करना है।

2 ssh कुंजी बनाने के बाद सफलतापूर्वक प्रणाली प्रत्येक कनेक्शन के लिए एक मिलान ssh कुंजी खोजने का प्रयास करेगी।

बस स्पष्ट होने के लिए आप इन आदेशों के साथ एक नई कुंजी बना सकते हैं

# generate key make sure you give it a new name (id_rsa_server2)
ssh-keygen 
# make sure ssh agent is running
eval `ssh-agent`
# add the new key
ssh-add ~/.ssh/id_rsa_server2
# get the public key to add it to a remote system for authentication
cat ~/.ssh/id_rsa_server2.pub

1

GITHUB में कई प्रमुख जोड़े

1.0 SSH CONFIG फ़ाइल

1.1 ~ ~ .ssh / config बनाएँ

1.2 chmod 600 ~ /। Ssh / config (MUST)

1.3 इनपुट फ़ाइल में निम्नलिखित:

मेजबान पिज्जा

HostName github.com

पसंदीदाअनुशासन publickey # वैकल्पिक

IdentityFile ~ / .ssh / privatekey1

केस ए: FRESH NEW GIT CLONE

क्लोन करने के लिए इस कमांड का उपयोग करें:

$ git क्लोन क्लोन git @ पिज़्ज़ा: yourgitusername / pizzahut_repo.git

नोट: यदि आप भविष्य में होस्ट नाम "पिज़्ज़ा" के .shsh / config को बदलना चाहते हैं, तो git क्लोन फ़ोल्डर में जाएं, संपादित करें .IT / कॉन्फ़िग फ़ाइल url लाइन (केस B देखें)

केस B: ALREADY HIT GIT CLONE FOLDER है

2.1 क्लोन फ़ोल्डर पर जाएं, फिर .git फ़ोल्डर में जाएं

2.2 कॉन्फ़िगर फ़ाइल संपादित करें

2.3 पुराने से नए तक url को अपडेट करें:

(Old) url = git@github.com:yourgitusername/pizzahut_repo.git    

(New) url = git@pizza:yourgitusername/pizzahut_repo.git


1

मेरे लिए केवल काम करने का उपाय केवल जोड़ना था ~/.ssh/config

Host *
  IdentityFile ~/.ssh/your_ssh_key
  IdentityFile ~/.ssh/your_ssh_key2
  IdentityFile ~/.ssh/your_ssh_key3
  AddKeysToAgent yes

your_ssh_key बिना किसी एक्सटेंशन के, उपयोग न करें .pub


0

Centos 6.5 पर OpenSSH_5.3p1, OpenSSL 1.0.1e-fips चल रहा है, मैंने अपनी मुख्य फ़ाइलों का नाम बदलकर समस्या को हल किया ताकि उनमें से किसी का भी डिफ़ॉल्ट नाम न हो। मेरी .ssh निर्देशिका में id_rsa_foo और id_rsa_bar हैं लेकिन कोई id_rsa, आदि नहीं हैं।


और चाबियों का उपयोग कैसे किया जाता है? क्या कोई ऑटो-डिटेक्शन है?
रोज़बेक


0

पर mentionend रूप Atlassian ब्लॉग पेज एक उत्पन्न config भीतर .ssh निम्न पाठ सहित:

#user1 account
 Host bitbucket.org-user1
     HostName bitbucket.org
     User git
     IdentityFile ~/.ssh/user1
     IdentitiesOnly yes

 #user2 account
 Host bitbucket.org-user2
     HostName bitbucket.org
     User git
     IdentityFile ~/.ssh/user2
     IdentitiesOnly yes

फिर आप बस प्रत्यय डोमेन के साथ चेकआउट कर सकते हैं और परियोजनाओं के भीतर आप स्थानीय रूप से लेखक के नाम आदि को कॉन्फ़िगर कर सकते हैं।


0

आप एकाधिक ssh कुंजी बनाए रखने के लिए इस sshmulti npm पैकेज को आज़मा सकते हैं ।


मैं दृढ़ता से इस तरह से कुछ के लिए npm का उपयोग नहीं करने की सलाह दूंगा। इसमें निर्भरता का एक झरना था, जो संक्षिप्त निरीक्षण पर, कई साल पुराने पैकेजों में लोन-वुल्फ डेवलपर्स की एक श्रृंखला शामिल करता है। Sshmulti npm पेज स्वयं घोषित करता है कि यह अप्रयुक्त है।
जैक वासे

0

यहाँ समाधान है कि मैं @ साजिब-खान के उत्तर से प्रेरित था । डिफ़ॉल्ट कॉन्फ़िगरेशन सेट नहीं है, यह gitlab पर मेरा व्यक्तिगत खाता है और दूसरा निर्दिष्ट मेरा कंपनी खाता है। यहाँ मैंने क्या किया:

Ssh कुंजी उत्पन्न करें

ssh-keygen -t rsa -f ~/.ssh/company -C "name.surname@company.com"

Ssh config संपादित करें

nano ~/.ssh/config

    Host company.gitlab.com
    HostName gitlab.com
    PreferredAuthentications publickey  
    IdentityFile ~/.ssh/company

कैश्ड ssh कुंजी हटाएं

ssh-add -D

झसे आज़माओ !

ssh -T git@company.gitlab.com

GitLab, @ hugo.sohm में आपका स्वागत है!

ssh -T git@gitlab.com

GitLab, @HugoSohm में आपका स्वागत है!

इसका इस्तेमाल करें !

कंपनी खाता

$ git clone git@company.gitlab.com:group/project.git

व्यक्तिगत / डिफ़ॉल्ट खाता

$ git clone git@gitlab.com:username/project.git

यहाँ स्रोत है कि मैं इस्तेमाल किया है, आशा है कि यह मदद करता है!


0

मुझे ~ / .ssh / config में निम्नलिखित सेट करने के लिए दृष्टिकोण पसंद है:

# Config for Github to support multiple Github keys
Host  github.com
  HostName github.com
  User git
# UseKeychain adds each keys passphrase to the keychain so you don't have to enter the passphrase each time.
  UseKeychain yes
# AddKeysToAgent would add the key to the agent whenever it is used, which might lead to debugging confusion since then sometimes the one repo works and sometimes the other depending on which key is used first.
#  AddKeysToAgent yes
# I only use my private id file so all private repos don't need the env var `GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa"` to be set.
  IdentityFile ~/.ssh/id_rsa

फिर अपने रेपो में आप एक .envफाइल बना सकते हैं जिसमें ssh कमांड का उपयोग किया जाना है:

GIT_SSH_COMMAND="ssh -i ~/.ssh/your_ssh_key"

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

यह समाधान पूरी तरह से गिट के साथ काम करता है और मैक (कारण UseKeychain) पर काम करने के लिए डिज़ाइन किया गया है ।

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