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


646

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

-i identity_file

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

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


3

2
इसके अलावा संबंधित serverfault.com/questions/194567/...
Machavity

जवाबों:


671

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

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

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

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

chmod 400 ~/.ssh/id_rsa_github

117
यदि आपको अलग-अलग कुंजियों के साथ एक ही होस्ट से कनेक्ट करने की आवश्यकता है तो क्या होगा?
वैलेंटाइन क्लिंगहैमर

6
@Quelltextfabrik - आप एक अलग होस्ट के साथ एक और अनुभाग जोड़ सकते हैं: nerderati.com/2011/03/…
बेन

1
@ मेरे मेनपेज में क्लिफ नोप: " HostName: लॉग इन करने के लिए वास्तविक होस्ट नाम निर्दिष्ट करता है। इसका उपयोग मेजबानों के लिए उपनाम या संक्षिप्त विवरण निर्दिष्ट करने के लिए किया जा सकता है।" मेरा ssh वर्जन Opensh-6.7p1 है।
ग्रिसिओम

11
अगर कॉन्फिग फ़ाइल नई है, तो करना न भूलेंchmod 600 ~/.ssh/config
Elysch

2
@ValentinKlinghammer @ फाल्म के उत्तर में इस प्रश्न का हल है। यह core.sshCommandगिट विन्यास का उपयोग करना है। superuser.com/a/912281/162466
VasyaNovikov

345

पर्यावरण चर GIT_SSH_COMMAND:

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

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

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

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

विन्यास core.sshCommand:

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

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

1
मुझे इस काम को करने के लिए शेल वैरिएबल को एक पर्यावरण चर पर निर्यात करना था , अर्थात export GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example", फिरgit clone example
अब्दुल

7
@ अब्दुल बैश में, कमांड के रूप में एक ही लाइन पर असाइनमेंट करने से पर्यावरण कमांड केवल उस कमांड के लिए निर्यात होता है। इसे आज़माएँ example=hello /usr/bin/env | grep example:।
फ्लिम

3
चीजें और भी बेहतर हो गई हैं: Git 2.10 के रूप में, आप अपने Git कॉन्फ़िगरेशन में कमांड को स्टोर कर सकते हैं: stackoverflow.com/a/38474220/520162
eckes

2
@ नोइटिडार्ट /dev/nullयूनिक्स-जैसे ऑपरेटिंग सिस्टम में केवल एक वैध नाम है, यह विंडोज पर काम नहीं करता है।
फ्लिम

2
GIT_SSH_COMMANDजब तक मैं IdentitiesOnlyइस तरह के आदेश के रूप में इस्तेमाल किया , मेरे लिए काम नहीं किया GIT_SSH_COMMAND="ssh -i ~/.ssh/mysubdir/id_rsa -o 'IdentitiesOnly yes'" git push:।
टायलर कोलियर

111

यह बताने का कोई सीधा तरीका नहीं है कि 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पर्यावरण चर (Git 2.3.0+) का उपयोग करके ssh तर्क पास करें ।

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

$ 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बाइनरी को निर्दिष्ट करने के लिए पर्यावरण चर का उपयोग करके 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_SSHv0.99.4 (2005) के बाद से उपलब्ध है

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

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

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

1
//, क्या होगा अगर ssh- एजेंट में आपकी पहचान इस सवाल के रूप में आगे की है? superuser.com/questions/971732/…
नाथन बसानी 18

1
मैंने मुझे इस पोस्ट को पुन: स्वरूपित करने की अनुमति दी है: IMO यह अब तक का सबसे व्यापक उत्तर है। अपने मूल डिजाइन में, एक त्वरित स्कैन ने उस पद का सुझाव दिया जहां समस्या के एक एकल जटिल समाधान का वर्णन किया गया था, इसलिए मैंने इसे याद किया।
अल्बर्टो

3
$ ssh-agent sh -c 'ssh-add ~/.ssh/id_rsa; git fetch user@host'मेरे लिए काम किया जब कुछ और नहीं होगा। कुडोस।
डैनियल डेहर्स्ट

1
मुझे ~/.ssh/configविधि का उपयोग करना था , env var ने मेरे लिए काम नहीं किया ...
ग्रेग डबिकि

1
GIT_SSHv0.99.4 (अगस्त 2005) के बाद से उपलब्ध है , इसलिए मूल रूप से Git मौजूद है (अप्रैल 2005)।
डोमिनिक

32

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


2
ऐसा करने का एक और स्पष्टीकरण
सिथसू

1
~/.ssh/configहै जाने का रास्ता।
hek2mgl

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

18

यदि आप हर बार git चलाने के लिए वातावरण चर निर्दिष्ट नहीं करना चाहते हैं, तो दूसरी आवरण स्क्रिप्ट नहीं चाहते हैं, ssh-agent (1) नहीं चला सकते हैं, और न ही इसके लिए कोई अन्य पैकेज डाउनलोड करना चाहते हैं, git का उपयोग करें -आराम-एक्सट (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)

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

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

2
यह जवाब बिल्कुल वही था जो मुझे gitनिजी जीथूब रिपॉजिटरी से क्लोन / लाने के लिए रिपॉजिटरी-विशिष्ट परिनियोजन कुंजी का उपयोग करने के लिए शेफ के संसाधन को बाध्य करने के लिए आवश्यक था । पर्यावरण / लिपि आधारित लोगों पर इस पद्धति का अतिरिक्त लाभ यह है कि चूंकि की-पाथ वर्किंग-रेपो के कॉन्फिग में एन्कोडेड है, इसलिए यह प्रारंभिक क्लोन और बाद में आने वाले दोनों प्रेशर / पुश पर एक ही कुंजी का उपयोग करेगा।
एडम फ्रेंको

2
वाह! यह सिर्फ महान है, इस बारे में पता नहीं था। उत्तर के लिए धन्यवाद, कठपुतली वातावरण में काफी मददगार, प्रबंधन .ssh/configआदि के लिए अतिरिक्त परेशानी को रोकने के लिए +1!
gf_

1
यह समाधान - theccursive ध्वज के साथ एक साथ काम नहीं करता है। सबमोड्यूल्स को निर्दिष्ट कुंजी का उपयोग करके नहीं लाया जाता है और यदि उन्हें आवश्यक है तो असफल हो जाता है।
डेनियल टेस्टा

1
प्रत्येक सबमॉड्यूल एक पूरी तरह से अलग रिपॉजिटरी है, जिसमें उनके स्वयं के सेट हैं। वे आपकी सुविधा के लिए Git द्वारा एक साथ सरेस से जोड़ा हुआ हैं, लेकिन किसी भी तरह से एक सबमॉड्यूल के लिए रीमोट माता-पिता के भंडार में लोगों से बंधे नहीं हैं। मुझे डर है कि आपको काम करने के लिए माता-पिता में पुनरावृत्ति के लिए प्रत्येक सबमॉड्यूल extमें परिवहन का उपयोग करके रिमोट सेट करना होगा ।
flaviovs

2
यदि आप निम्न त्रुटि का सामना करते हैं fatal: transport 'ext' not allowed, तो आपको इसके माध्यम से ext प्रोटोकॉल को श्वेत सूची में लाना होगा export GIT_ALLOW_PROTOCOL=ext। मूल रूप से, गिट-रिमोट-एक्सट्रीम रिमोट हेल्पर (जो "ext :: ssh example.com% S foo / repo" URLs का समर्थन करता है) मनमाने ढंग से कमांड निष्पादन की अनुमति देता है। यह आमतौर पर कभी चिंता का विषय नहीं होता है क्योंकि उपयोगकर्ता हमेशा उस URL को देखता है और उस पर भरोसा करता है जिसे वे पास करते हैं। हालांकि .itmodules फ़ाइल के माध्यम से, सबमॉड्यूल्स को git करें, एक हमलावर को ग्राहक से मनमाना git URL लाने के लिए अनुरोध करने की अनुमति देता है। hackerone.com/reports/104465
गोमिनो

18

~/.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  

2
यह वह उत्तर है जिसकी मुझे तलाश थी, क्योंकि मेरे पास घर और काम के लिए अलग-अलग गिटहब खाते हैं। मुझे बस काम करना था Host work.github.com HostName github.com IdentityFile ~/.ssh/work, और उसके बाद "github.com" को "work.github.com" से बदल दिया, जब भी मैं कोई काम रिपॉजिटरी क्लोन करता। यह अभी भी "github.com" से जुड़ता है, लेकिन एक गैर-डिफ़ॉल्ट कुंजी जोड़ी का उपयोग करता है।
मिकेल

1
विवरण के लिए URL (" itblog.study.land / ..." ) किसी भी अधिक काम नहीं करता है :(
कार्ल Smotricz

: @CarlSmotricz मूल यहां ले जाया गया था medium.com/@thucnc/...
thucnguyen

4
आखिरकार!!! यह उत्तर वास्तव में दिखाता है कि आप ~/.ssh/configफ़ाइल में क्या डाल सकते हैं । हर दूसरा जवाब याद आता है कि आप मूल को जोड़ने पर होस्ट को कैसे सेट कर सकते हैं, जो स्वचालित रूप से सही कुंजी फ़ाइल का उपयोग करने की अनुमति देता है। धन्यवाद!!
ब्रायन वीपीएस

1
अच्छा, वह वही था जो मैं देख रहा था :)
लुकास

15

मेरे साथ मेरे संघर्ष के बाद जो मेरे $GIT_SSHलिए काम आया उसे साझा करना चाहूंगा।

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

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

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

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

$ 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

और सभी काम करेंगे।


धन्यवाद। बस ध्यान दें: पास-थ्रू तर्कों के लिए $ * के बजाय "$ @" का उपयोग करें, क्योंकि पूर्व में सही तरीके से व्यवहार होता है जब तर्कों में व्हॉट्सएप होता है।
पिओटर फाइंडसेन

@PiotrFindeisen आपके नोट के लिए धन्यवाद। हालांकि, मैं इसे पूरी तरह से नहीं समझता हूं - ज़श में यह मुझे एक टुकड़े में अंतरिक्ष के साथ तार रखने में मदद करता है, लेकिन बैश में नहीं। क्या आप मुझे अधिक बता सकते हैं या कुछ स्पष्टीकरण की ओर इशारा कर सकते हैं? मैं आँख बंद करके कुछ संशोधन नहीं जोड़ना चाहता।
Jan Vlcinsky

आपको अपने उत्तर का पहला भाग निकालना चाहिए। किसी के समाधान में कोई दिलचस्पी नहीं है जो काम नहीं करता है, और यह पढ़ने को बर्बाद कर देता है जो नीचे सही उत्तर देता है, जो आश्चर्यजनक रूप से काम करता है।
सेरिन

@Cerin यदि आपका मतलब है "त्रुटि से बचने के लिए" मैं इसे वहां रखने जा रहा हूं। यह बचने के लिए सामान्य नुकसान साझा करता है और यह बहुत कम है। मुझे यकीन है, कोई व्यक्ति सभी चीजों को चर में प्रदान करके समाधान का अनुकूलन करने की कोशिश करेगा (यह मेरे साथ हुआ), इसलिए मैंने सफलता की राह कम करने की कोशिश की।
Jan Vlcinsky

5

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

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

यह मांग पर ssh कुंजियों को लोड करता है जब पहली बार जरूरत होती है, एक बार, यहां तक ​​कि कई लॉगिन सत्रों, xterms या NFS साझा घरों के साथ।

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


5

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

मेरा समाधान यह था कि इसे मेरे .zshrc / .bashrc में जोड़ा जाए:

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

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

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

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


4

इसलिए मैंने GIT_SSH env वैरिएबल को सेट किया $HOME/bin/git-ssh

मेरे रेपो कॉन्फ़िगरेशन का समर्थन करने के लिए कौन सी ssh पहचान का उपयोग करना है, मेरी ~/bin/git-sshफ़ाइल यह है:

#!/bin/sh
ssh -i $(git config --get ssh.identity) -F /dev/null -p 22 $*

तब मेरे पास एक वैश्विक git config सेटिंग है:

$ git config --global ssh.identity ~/.ssh/default_id_rsa

और किसी भी git रिपॉजिटरी के भीतर मैं सिर्फ एक स्थानीय ssh.identitygit कॉन्फिगर वैल्यू सेट कर सकता हूं :

$ git config --local ssh.identity ~/.ssh/any_other_id_rsa

देखा!

यदि आपके पास प्रत्येक पहचान के लिए एक अलग ईमेल पता हो सकता है, तो यह और भी सरल हो जाता है, क्योंकि आप अपने ईमेल पते के बाद अपनी कुंजी को नाम दे सकते हैं और फिर git config के user.email को ~/bin/git-sshइस तरह से कुंजी चयन को ड्राइव कर सकते हैं :

#!/bin/sh
ssh -i $HOME/.ssh/$(git config --get user.email) -F /dev/null -p 22 $*

2

मेरा समाधान यह था:

एक स्क्रिप्ट बनाएं:

#!/bin/bash
KEY=dafault_key_to_be_used
PORT=10022 #default port...
for i in $@;do
   case $i in
    --port=*)
        PORT="${i:7}";;
    --key=*)KEY="${i:6}";;
   esac
done
export GIT_SSH_COMMAND="ssh -i $HOME/.ssh/${KEY} -p ${PORT}"
echo Command: $GIT_SSH_COMMAND

तब जब आपको var रन बदलना होगा:

. ./thescript.sh [--port=] [--key=]

अतिरिक्त डॉट मत भूलना !! यह स्क्रिप्ट वातावरण vars सेट करता है !! --key और --port वैकल्पिक हैं।


2

आम तौर पर, आप इसके लिए उपयोग करना चाहते हैं ~/.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के लिए डिफ़ॉल्ट कुंजी के रूप में सेट करने के लिए उपयोग करता हूं ।


2

मैं कुछ टीके के साथ @ एसहॉलिक और इस एसओ धागे का निर्माण करता हूं। मैं एक उदाहरण के रूप में GitHub का उपयोग करता हूं और यह मानता हूं कि आपके पास एक निजी कुंजी है ~/.ssh/github(अन्यथा, इस SO थ्रेड को देखें ) और आपने अपने GitHub प्रोफ़ाइल में सार्वजनिक कुंजी जोड़ दी (अन्यथा GitHub की सहायता देखें )।

यदि आवश्यक हो, तो एक नई SSH विन्यास फाइल बनाएँ ~/.ssh/configऔर अनुमतियाँ 400 में बदलें

touch ~/.ssh/config
chmod 600 ~/.ssh/config

इसे ~/.ssh/configफ़ाइल में जोड़ें :

Host github.com
    IdentityFile ~/.ssh/github
    IdentitiesOnly yes

यदि आपके पास पहले से कोई रिमोट सेट अप है, तो आप इसे हटाना चाहते हैं, अन्यथा आपको उपयोगकर्ता नाम और पासवर्ड के लिए संकेत दिया जा सकता है:

git remote rm origin

फिर git रिपॉजिटरी में एक रिमोट जोड़ें, और उपयोगकर्ता नाम से पहले कोलन को नोटिस करें:

git remote add origin git@github.com:user_name/repo_name.git

और फिर git कमांड सामान्य रूप से काम करते हैं, जैसे:

git push origin master
git pull origin 

इस SO थ्रेड पर @HeyWatch यह सुझाव दिया गया कि IdentitiesOnly yesप्रत्येक प्रोटोकॉल के लिए डिफ़ॉल्ट फ़ाइलनाम से मेल खाती पहचान फ़ाइल भेजने के SSH डिफ़ॉल्ट व्यवहार को रोकने के लिए। अधिक जानकारी और संदर्भ के लिए उस धागे को देखें।


यह मेरी गलती थी: "यदि आपके पास पहले से ही एक रिमोट सेट है ..."। बहुत बहुत धन्यवाद!!!
एलन एंड्रेड

आम गलती --- यह जवाब है
गोडार्ड

1

बस उपयोग ssh-agentऔर ssh-addआज्ञा।

# create an agent
ssh-agent

# add your default key
ssh-add ~/.ssh/id_rsa

# add your second key
ssh-add ~/.ssh/<your key name>

उपरोक्त आदेशों को निष्पादित करने के बाद, आप दोनों कुंजियों को एक ही समय में उपयोग कर सकते हैं। बस टाइप करो

git clone git@github.com:<yourname>/<your-repo>.git

अपने रिपॉजिटरी को क्लोन करने के लिए।

अपने मशीन को रिबूट करने के बाद आपको उपरोक्त कमांड को निष्पादित करना होगा।


कृपया इस प्रक्रिया की व्याख्या करें जिसमें मैं एक एजेंट कैसे बना सकता हूं
श्रीकृष्णा

0

मैं git संस्करण 2.16 का उपयोग कर रहा हूं और मुझे स्क्रिप्ट के एक भी टुकड़े की आवश्यकता नहीं है, यहां तक ​​कि एक विन्यास या संशोधित कमांड भी नहीं।

  • बस मेरी निजी कुंजी को .ssh / id_rsa पर कॉपी किया
  • अनुमतियाँ 600 पर सेट करें

और गिट स्वचालित रूप से कुंजी को पढ़ता है। मैं कुछ नहीं पूछता और यह एक त्रुटि नहीं है। बस ठीक काम करता है।


क्या आपने देखा कि यह सवाल " ~/.sshनिर्देशिका में कई निजी कुंजियों वाली प्रणाली" के बारे में है ?
स्कॉट

0

हालांकि सवाल यह अनुरोध नहीं करता है, मैं इस उत्तर को किसी और के लिए विशेष रूप से लिए एक ही समस्या को हल करने के लिए शामिल कर रहा

गिटलब का घोल

मैंने दृष्टिकोण का उपयोग करने की कोशिश की , लेकिन यहां तक कि गिट प्रलेखन~/.ssh/config सरल मामले की तुलना में अधिक कुछ के लिए उपयोग करने की सलाह देता है। मेरे मामले में मैं एक सर्वर पर जोर दे रहा हूं - और मैं एक विशिष्ट उपयोगकर्ता के रूप में ऐसा करना चाहता था - जो कि दौरान द्वारा परिभाषित किया गया है और उपयोगकर्ता नाम नहीं है । एक बार लागू होने के बाद मैं बस निम्नलिखित कार्य करता हूं:git

~/myrepo> git mycommit -m "Important Stuff"
~/myrepo> git mypush
[proceed to enter passphrase for private key...]

सेट अप

मेरे मामले में आपकी का स्थान याद करें /myfolder/.ssh/my_gitlab_id_rsa

इसमें एक प्रविष्टि जोड़ें ~/.ssh/config:

Host gitlab-delegate
    HostName gitlab.mydomain.com
    User git
    IdentityFile /myfolder/.ssh/my_gitlab_id_rsa
    IdentitiesOnly yes

को इसमें जोड़ें ~/.gitconfig:

mypush = "!f() { \
           path=$(git config --get remote.origin.url | cut -d':' -f2); \
           branch=$(git rev-parse --abbrev-ref HEAD); \
           git remote add gitlab_as_me git@gitlab-delegate:$path && \
           git push gitlab_as_me $branch && \
           git pull origin $branch; \
           git remote remove gitlab_as_me; \
         }; f"

एक बोनस के रूप में, मैं इस मेजबान पर इस साथ एक विशिष्ट उपयोगकर्ता के रूप में अपना प्रदर्शन करता हूं :

mycommit = "!f() { \
             git -c "user.name=myname" -c "user.email=myname@mysite.com" commit \"$@\"; \
           }; f"

व्याख्या

उपरोक्त सभी प्रासंगिक रिमोट है originऔर वर्तमान में संबंधित शाखा की जाँच की जाती है। संदर्भ के लिए मैं कई मदों में भाग गया जिन्हें संबोधित करने की आवश्यकता थी:

  • समाधान के लिए एक नया रिमोट बनाने की आवश्यकता होती है gitlab_as_me, और मुझे अपने लॉग ट्री में अतिरिक्त रिमोट को लटकते हुए देखना पसंद नहीं था इसलिए मैं इसे समाप्त होने पर हटा देता हूं
  • रिमोट बनाने के लिए, फ्लाई पर रिमोट के url को उत्पन्न करने की आवश्यकता है - गिटलैब के मामले में यह एक साधारण बैश साथ प्राप्त किया गया था
  • जब gitlab_as_meआप एक धक्का दे रहे हैं, तो आपको किस शाखा पर जोर दे रहे हैं, इसके बारे में विशिष्ट होना चाहिए
  • पुश करने के बाद अपने स्थानीय originपॉइंटर को मिलान करने के लिए "अपडेट" होना चाहिए gitlab_as_me(ऐसा git pull origin $branchकरता है)

0

जब आपके पास कई गिट खाता है और आप अलग ssh कुंजी चाहते हैं

Ssh कुंजी जनरेट करने के लिए आपको एक ही चरण का पालन करना होगा, लेकिन सुनिश्चित करें कि आप

ssh-keygen -t ed25519 -C "your-email-id@gmail.com" 

वह पथ दर्ज करें जिसे आप सहेजना चाहते हैं (उदा: my-pc / Desktop / .ssh / ed25519)

अपने gitlab में सार्वजनिक कुंजी जोड़ें (gitlab में ssh कुंजी कैसे जोड़ें )

नीचे दिए गए कॉमन का उपयोग करके आपको नई ssh पहचान देनी होगी

ssh-add ~/my-pc/Desktop/.ssh/ed25519

(१) क्या आप किसी को या कुछ को उद्धृत कर रहे हैं? यदि हां, तो कृपया स्रोत की पहचान करें। यदि नहीं, तो कृपया उद्धरण स्वरूपण का उपयोग न करें। (२) "ed25519" क्या है? ……………………… कृपया टिप्पणियों में प्रतिक्रिया न दें;  इसे स्पष्ट और अधिक पूर्ण बनाने के लिए अपना उत्तर संपादित करें।
स्कॉट

0
    # start :: how-to use different ssh identity files

    # create the company identity file
    ssh-keygen -t rsa -b 4096 -C "first.last@corp.com"
    # save private key to ~/.ssh/id_rsa.corp, 
    cat ~/.ssh/id_rsa.corp.pub # copy paste this string into your corp web ui security ssh keys

    # create your private identify file
    ssh-keygen -t rsa -b 4096 -C "me@gmail.com"
    # save private key to ~/.ssh/id_rsa.me, note the public key ~/.ssh/id_rsa.me.pub
    cat ~/.ssh/id_rsa.me.pub # copy paste this one into your githubs, private keys

    # clone company internal repo as follows
    GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.corp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
    git clone git@git.in.corp.com:corp/project.git

    export git_msg="my commit msg with my corporate identity, explicitly provide author"
    git add --all ; git commit -m "$git_msg" --author "MeFirst MeLast <first.last@corp.com>"
    GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.corp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
    git push 
    # and verify 
    clear ; git log --pretty --format='%h %ae %<(15)%an ::: %s

    # clone public repo as follows
    GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.corp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
    git clone git@github.com:acoolprojectowner/coolproject.git

    export git_msg="my commit msg with my personal identity, again author "
    git add --all ; git commit -m "$git_msg" --author "MeFirst MeLast <first.last@gmail.com>"
    GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.me -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
    git push ; 
    # and verify 
    clear ; git log --pretty --format='%h %ae %<(15)%an ::: %s

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