किसी दिए गए डोमेन के लिए git पुश के लिए SSH कुंजी निर्दिष्ट करें


342

मेरे पास निम्नलिखित उपयोग का मामला है: मैं git@git.company.com:gitolite-adminउपयोगकर्ता की निजी कुंजी का उपयोग करने के लिए धक्का देने में सक्षम होना चाहूंगा gitolite-admin, जबकि मैं git@git.company.com:some_repoअपनी 'निजी' कुंजी का उपयोग करने के लिए धक्का देना चाहता हूं। AFAIK, मैं इसका उपयोग करके हल नहीं कर सकता ~/.ssh/config, क्योंकि उपयोगकर्ता नाम और सर्वर नाम दोनों मामलों में समान हैं। जैसा कि मैं ज्यादातर अपनी निजी कुंजी का उपयोग करता हूं, मैंने उस के लिए परिभाषित किया ~/.ssh/configहै git@git.company.com। क्या किसी को एक एकल gitआह्वान के लिए उपयोग की जाने वाली कुंजी को ओवरराइड करने का तरीका पता है ?

(इसके अलावा: gitolite यह बताता है कि कुंजी के आधार पर कौन पुश कर रहा है, इसलिए यह एक्सेस, स्वामित्व और ऑडिटिंग के मामले में कोई समस्या नहीं है, कि उपयोगकर्ता @ सर्वर स्ट्रिंग विभिन्न उपयोगकर्ताओं के लिए समान है।)


जवाबों:


597

यहां तक ​​कि अगर उपयोगकर्ता और होस्ट एक ही हैं, तो भी उन्हें अलग किया जा सकता है ~/.ssh/config। उदाहरण के लिए, यदि आपका कॉन्फ़िगरेशन इस तरह दिखता है:

Host gitolite-as-alice
  HostName git.company.com
  User git
  IdentityFile /home/whoever/.ssh/id_rsa.alice
  IdentitiesOnly yes

Host gitolite-as-bob
  HostName git.company.com
  User git
  IdentityFile /home/whoever/.ssh/id_dsa.bob
  IdentitiesOnly yes

तो फिर तुम बस का उपयोग gitolite-as-aliceऔर gitolite-as-bobबजाय अपने URL में होस्ट नाम की:

git remote add alice git@gitolite-as-alice:whatever.git
git remote add bob git@gitolite-as-bob:whatever.git

ध्यान दें

आप IdentitiesOnly yesडिफ़ॉल्ट आईडी के उपयोग को रोकने के लिए विकल्प को शामिल करना चाहते हैं । अन्यथा, यदि आपके पास डिफ़ॉल्ट नामों से मेल खाते आईडी फाइलें भी हैं, तो उन्हें पहले कोशिश की जाएगी क्योंकि अन्य कॉन्फ़िगरेशन विकल्पों के विपरीत (जो "पहले जीत" में रहते हैं) IdentityFileविकल्प कोशिश करने के लिए पहचान की सूची में संलग्न है। देखें: /server/450796/how-could-i-stop-ssh-offering-a-wrong-key/450807#450807


9
बहुत अच्छे धन्यवाद। मुझे समझ में नहीं आया था कि आप स्वतंत्र रूप से ~ / .ssh / config में होस्ट विनिर्देशन के लिए एक 'उपनाम' चुन सकते हैं
उलझन

4
इस उत्तर के लिए भी धन्यवाद! मेरे लिए एक गेटा यह था कि IdentityFile को एक पूर्ण पथ बनाने की आवश्यकता है (मैंने IdentityFile के अपने तर्क के रूप में केवल id_rsa.rick को रखा, और यह विफल रहा)। पहचान के लिए अन्य वाक्यविन्यास के लिए ssh_config (5) मैन पेज देखें।
रिकुमाली

1
बहुत स्पष्ट और बहुत उपयोगी उत्तर के लिए धन्यवाद। मैंने इसे थोड़ी देर के लिए काम करने की कोशिश की थी और इस धारणा के साथ छोड़ दिया था कि एक ही उपयोगकर्ता को उसी id_rsa निजी कुंजी फ़ाइल का उपयोग करना होगा।
DrCord

7
git@के रूप में यह में दी गई है दूरस्थ में भाग आवश्यक नहीं है Userconfig की लाइन।
dolmen

2
मैं इस समाधान के साथ संघर्ष कर रहा था जब तक कि मैं होस्ट के लिए IdentitiesOnly yesलाइन के तुरंत बाद एक और लाइन नहीं IdentityFileजोड़ता। ऐसा लगता है कि यह कई पहचानों के साथ गुजर रहा था और उनमें से एक को मेजबान तक पहुंचने से रोक दिया गया था।
फिटर मैन

57

मार्क लॉन्गेयर द्वारा ऊपर की पेशकश की गई एक वैकल्पिक दृष्टिकोण एक उपनाम का उपयोग करना है जो किसी भी पर, किसी भी कमांड को चलाएगा कुंजी के साथ रिमोट । यह विचार मूल रूप से git कमांड को चलाने के दौरान आपकी SSH पहचान को स्विच करने के लिए है।

अन्य उत्तर में मेजबान उर्फ ​​दृष्टिकोण के सापेक्ष लाभ:

  • स्पष्ट रूप से निर्दिष्ट नहीं कर सकते हैं, भले ही किसी भी गिट कमांड या उपनाम के साथ काम करेंगे remote
  • कई रिपॉजिटरी के साथ काम करना आसान है क्योंकि आपको इसे केवल एक बार क्लाइंट मशीन पर सेट करने की आवश्यकता है, न कि प्रत्येक क्लाइंट मशीन पर एक बार रिपॉजिटरी के अनुसार।

मैं कुछ छोटी स्क्रिप्ट और एक git उपनाम का उपयोग करता हूं admin। इस तरह मैं कर सकता हूँ, उदाहरण के लिए:

git admin push 

वैकल्पिक ("व्यवस्थापक") SSH कुंजी का उपयोग करके डिफ़ॉल्ट रिमोट पर पुश करने के लिए। फिर, आप pushइस उपनाम के साथ किसी भी कमांड (सिर्फ नहीं ) का उपयोग कर सकते हैं । आप git admin clone ...एक रिपॉजिटरी को क्लोन करने के लिए भी कर सकते हैं जो आपके पास केवल "एडमिन" कुंजी का उपयोग करने के लिए होगा।

चरण 1: वैकल्पिक SSH कुंजियाँ बनाएँ, वैकल्पिक रूप से पासफ़्रेज़ सेट करें यदि आप किसी और की मशीन पर ऐसा कर रहे हैं।

चरण 2: "ssh-as.sh" नामक एक स्क्रिप्ट बनाएं जो SSH का उपयोग करने वाले सामान को चलाती है, लेकिन डिफ़ॉल्ट के बजाय दिए गए SSH कुंजी का उपयोग करती है:

#!/bin/bash
exec ssh ${SSH_KEYFILE+-i "$SSH_KEYFILE"} "$@"

चरण 3: "git-as.sh" नामक एक स्क्रिप्ट बनाएं जो दिए गए SSH कुंजी का उपयोग करके git कमांड चलाता है।

#!/bin/bash
SSH_KEYFILE=$1 GIT_SSH=${BASH_SOURCE%/*}/ssh-as.sh exec git "${@:2}"

चरण 4: एक उपनाम जोड़ें (नीचे "PATH_TO_SCRIPTS_DIR" के लिए उपयुक्त कुछ का उपयोग करके):

# Run git commands as the SSH identity provided by the keyfile ~/.ssh/admin
git config --global alias.admin \!"PATH_TO_SCRIPTS_DIR/git-as.sh ~/.ssh/admin"

Http://noamlewis.wordpress.com/2013/01/24/git-admin-an-alias-for-running-git-commands-as-a-privileged-ssh-identity/ पर अधिक जानकारी


4
बहुत अच्छा जवाब। सुरक्षित होने के लिए $@-> के आसपास दोहरे उद्धरण जोड़ना न भूलें "$@"
केविनर्पपे

@sinelaw क्या यह अभी भी काम करता है? मुझे हर समय अनुमति अस्वीकृत त्रुटि मिलती है
आलोक कुमार

55

आप git पर्यावरण चर का उपयोग कर सकते हैं GIT_SSH_COMMAND। इसे अपने git रिपॉजिटरी के तहत अपने टर्मिनल में चलाएं:

GIT_SSH_COMMAND='ssh -i ~/.ssh/your_private_key' git submodule update --init

~/.ssh/your_private_keySsh निजी कुंजी जिसे आप उपयोग करना चाहते हैं, के मार्ग से बदलें । और आप बाद के git कमांड को बदल सकते हैं (उदाहरण में git submodule update --init) दूसरों को git pull, जैसे git fetch, आदि।


1
फुल डॉक git-scm.com/docs/git#git-codeGITSSHcode पर है ; हालांकि यह एक हाल ही में Git (> = 2.3। *) की जरूरत है।
क्रिश्चियन उलब्रिच

2
एक सरल समाधान के लिए धन्यवाद, जिसे एक पर्यावरण चर सेट करने के अलावा कुछ भी आवश्यकता नहीं है।
नूह सूसमैन

4
ध्यान दें कि आपका ~ / .ssh / id_rsa (या जो भी आपकी डिफ़ॉल्ट कुंजी है) आपके द्वारा -आई में पास होने पर पूर्वता लेगा। इसलिए आप वास्तव में GIT_SSH_COMMAND = 'ssh -i ~ / .ssh / your_pStreet_key -o IdentitiesOnly = yes' का उपयोग करना चाहते हैं ताकि इसे अन्य कुंजियों को अनदेखा किया जा
सके

आप git पुश को कैसे अपडेट कर सकते हैं? मैं इसे प्रलेखन में नहीं पा सकता था
le342045

सिटेलॉ के जवाब के समान या बैश या गिट उपनाम बनाने के लिए अच्छा होगा - कहीं स्क्रिप्ट बनाने के बजाय इस पद्धति का उपयोग करना।
Inigo

14

एक यूनिक्स आधारित प्रणाली (लिनक्स, बीएसडी, मैक ओएस एक्स), डिफ़ॉल्ट पहचान 2 फाइलों में निर्देशिका $ HOME.ssh में संग्रहीत की जाती है : private key: $HOME/.ssh/id_rsa public key: $HOME/.ssh/id_rsa.pub जब आप sshबिना विकल्प -iका उपयोग करते हैं, तो यह दूरस्थ प्रणाली के साथ प्रमाणित करने के लिए डिफ़ॉल्ट निजी कुंजी का उपयोग करता है।

यदि आपके पास एक और निजी कुंजी है जिसका आप उपयोग करना चाहते हैं, उदाहरण के लिए $ HOME / .ssh / तैनात_की , तो आपको उपयोग करना होगाssh -i ~/.ssh/deploy_key ...

यह कष्टप्रद है। आप निम्न पंक्तियों को अपने $ HOME / .bash_profile में जोड़ सकते हैं : ssh-add ~/.ssh/deploy_key ssh-add ~/.ssh/id_rsa

हर बार जब आप का उपयोग करें तो sshया gitया scp(मूल रूप से sshभी), तो आप विकल्प का उपयोग करने की जरूरत नहीं है -iअब और।

आप जितनी चाहें उतनी कुंजियाँ जोड़ सकते हैं जैसे कि $ $ घर / .bash_profile में


10

एक और विकल्प ssh- पहचान का उपयोग करना है , अपनी ssh पहचान का प्रबंधन करना है

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


9

मैं विन 7 पर गिट बैश का उपयोग कर रहा हूं। निम्नलिखित ने मेरे लिए काम किया।

~ / .Ssh / config या c: / users / [your_user_name] / ssh / config पर एक विन्यास फाइल बनाएँ। फ़ाइल दर्ज करें:

Host your_host.com
     IdentityFile [absolute_path_to_your_.ssh]\id_rsa

मुझे लगता है कि होस्ट को एक URL होना चाहिए, न कि केवल एक "नाम" या आपके होस्ट के लिए Ref। उदाहरण के लिए,

Host github.com
     IdentityFile c:/users/[user_name]/.ssh/id_rsa

पथ को / c / उपयोगकर्ताओं / [user_name] / .... प्रारूप में भी लिखा जा सकता है

Giordano Scalzo द्वारा प्रदान किया गया समाधान बहुत अच्छा है। https://stackoverflow.com/a/9149518/1738546


9

2.10 से ऊपर की ओर gitconfig sshCommand सेटिंग का उपयोग करना भी संभव है। डॉक्स स्थिति :

यदि यह चर सेट किया जाता है, तो git fetch और git पुश ssh के बजाय निर्दिष्ट कमांड का उपयोग करेगा जब उन्हें रिमोट सिस्टम से कनेक्ट करने की आवश्यकता होगी। कमांड GIT_SSH_COMMAND पर्यावरण चर के रूप में एक ही रूप में है और पर्यावरण चर सेट होने पर ओवरराइड किया जाता है।

एक उदाहरण उदाहरण होगा: git config core.sshCommand "ssh -i ~/.ssh/[insert_your_keyname]

कुछ मामलों में यह काम नहीं करता है क्योंकि ssh_config कमांड को ओवरराइड करता है, इस मामले ssh -i ~/.ssh/[insert_your_keyname] -F /dev/nullमें ssh_config का उपयोग नहीं करने का प्रयास करें।


8

मैंने एक साथ पालना और परीक्षण किया है, निम्नलिखित दृष्टिकोणों को पढ़ने के आधार पर, जो कुछ तकनीकों को जोड़ती है:

  • सही SSH विन्यास
  • git URL फिर से लिखना

इस दृष्टिकोण का लाभ, एक बार सेट अप करने के बाद, इसे ठीक करने के लिए किसी अतिरिक्त कार्य की आवश्यकता नहीं होती है - उदाहरण के लिए, आपको दूरस्थ URL को बदलने या चीजों को अलग तरीके से याद रखने की आवश्यकता नहीं है - URL पुनर्लेखन यह सब काम करता है ।

~/.ssh/config

# Personal GitHub
Host github.com
  HostName github.com
  User git
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/github_id_rsa

# Work GitHub
Host github-work
  HostName github.com
  User git
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/work_github_id_rsa

Host *
  IdentitiesOnly yes

~/.gitconfig

[user]
    name = My Name
    email = personal@personal.email

[includeIf "gitdir:~/dev/work/"]
    path = ~/dev/work/.gitconfig

[url "github-work:work-github-org/"]
    insteadOf = git@github.com:work-github-org/

~/dev/work/.gitconfig

[user]
    email = work@work.email

जब तक आप अपने सभी काम रिपॉजिट के तहत ~ / देव / काम और व्यक्तिगत सामान कहीं और रखते हैं, तब तक git सर्वर के लिए पुल / क्लोन / पुश करते समय सही SSH कुंजी का उपयोग करेगा, और यह सभी को सही ईमेल पता भी देगा। आपका काम करता है

संदर्भ:


क्लोनिंग के साथ यह कैसे काम करता है? includeIfकेवल तभी काम करना चाहिए जब कोई .gitनिर्देशिका मौजूद हो जो मैंने सोचा था?
detly

रुको मैं इसे प्राप्त करता हूं, यह URL पुनर्लेखन है जो इसका ख्याल रखता है। यह उत्तर अविश्वसनीय रूप से उपयोगी है!
हिरासत में

4

यदि विंडोज़ पर ssh के Git के संस्करण का उपयोग किया जाता है, तो ssh config में पहचान फ़ाइल लाइन की तरह दिखता है

IdentityFile /c/Users/Whoever/.ssh/id_rsa.alice

कहाँ /cके लिए हैc:

चेक करने के लिए, git के bash में

cd ~/.ssh
pwd 

3

आपको डिफ़ॉल्ट होस्ट कॉन्फ़िगरेशन को निकालने (या टिप्पणी करने) की आवश्यकता हो सकती है .ssh / config फाइल


1

आप फ़ाइल config कुंजी ssh में सबसे अधिक निर्दिष्ट हैं:

# Default GitHub user
Host one
 HostName gitlab.com
 User git
 PreferredAuthentications publickey
 IdentityFile ~/.ssh/key-one
 IdentitiesOnly yes

#two user
Host two
 HostName gitlab.com
 User git
 PreferredAuthentications publickey
 IdentityFile ~/.ssh/key-two
 IdentitiesOnly yes

0

जैसा कि किसी और ने उल्लेख किया है, core.sshCommandएसएसएच कुंजी और अन्य मापदंडों को ओवरराइड करने के लिए कॉन्फ़िगरेशन का उपयोग किया जा सकता है।

यहां एक एक्सैम्पल है, जहां आपके पास नाम की एक वैकल्पिक कुंजी है ~/.ssh/workrsaऔर इसके तहत क्लोन किए गए सभी रिपॉजिटरी के लिए इसका उपयोग करना चाहते हैं ~/work

  1. के .gitconfigतहत एक नई फ़ाइल बनाएँ ~/work:
[core]
  sshCommand = "ssh -i ~/.ssh/workrsa"
  1. अपने वैश्विक गिट विन्यास में ~/.gitconfig, जोड़ें:
[includeIf "gitdir:~/work/"]
  path = ~/work/.gitconfig

0

उपयोग करने की एक संभावना प्रतिबंध के बजाय प्रतिबंध ~/.ssh/configका उपयोग करना है । विशेष रूप से घोषणाओं को लागू करने के लिए एक शेल कमांड को कॉल करता है या नहीं। बैश में आप निम्न कमांड का उपयोग कर सकते हैं:MatchHostMatch Exec

[ git@git.company.com:gitolite-admin = $(git config --get remote.origin.url)'' ]

[अगर दो तार बराबर हैं, तो यह सत्यापित करने के लिए bash कमांड का उपयोग करता है । इस मामले में यह परीक्षण कर रहा है कि क्या स्ट्रिंग कमांड git@git.company.com:gitolite-adminसे प्राप्त आउटपुट से मेल खाती है $(git config --get remote.origin.url)''

आप किसी अन्य कमांड का उपयोग कर सकते हैं जो शेल पर मौजूद रिपॉजिटरी की पहचान करता है। यह काम करने के लिए आपके शेल को मेरे मामले में परिभाषित करना महत्वपूर्ण है । पूरा उदाहरण तब निम्न होगा :$SHELL/bin/bash~/.ssh/config

Match Exec "[ git@git.company.com:gitolite-admin = $(git config --get remote.origin.url)'' ]"
  IdentityFile ~/.ssh/gitolite-admin
  IdentitiesOnly yes
  ForwardAgent no
  ForwardX11 no
  ForwardX11Trusted no

Match Exec "[ git@git.company.com:some_repo = $(git config --get remote.origin.url)'' ]"
  IdentityFile ~/.ssh/yourOwnPrivateKey
  IdentitiesOnly yes
  ForwardAgent no
  ForwardX11 no
  ForwardX11Trusted no

इस उदाहरण में मैंने मान लिया कि ~/.ssh/yourOwnPrivateKeyआपकी निजी कुंजी है और ~/.ssh/gitolite-adminइसमें उपयोगकर्ता की निजी कुंजी शामिल है gitolite-admin। मैंने IdentitiesOnly yesयह सुनिश्चित करने के लिए घोषणा को शामिल किया कि मार्क लॉन्गेयर द्वारा उल्लेखित गिट सर्वर में केवल एक कुंजी की पेशकश की जाती है । अन्य घोषणाएं git के लिए सिर्फ मानक ssh विकल्प हैं।

आप इस कॉन्फ़िगरेशन को जोड़ सकते हैं यदि आपके पास कई हैं some_repoजो आप विभिन्न कुंजियों के साथ उपयोग करना चाहते हैं। यदि आपके पास कई रिपॉजिटरी हैं git@git.company.comऔर उनमें से अधिकांश ~/.ssh/yourOwnPrivateKeyइसका उपयोग करते हैं तो होस्ट के लिए इस कुंजी को डिफ़ॉल्ट रूप से शामिल करने के लिए अधिक समझ में आता है। इस मामले में ~/.ssh/configयह होगा:

Match Exec "[ git@git.company.com:gitolite-admin = $(git config --get remote.origin.url)'' ]"
  IdentityFile ~/.ssh/gitolite-admin
  IdentitiesOnly yes

Host git.company.com
  IdentityFile ~/.ssh/yourOwnPrivateKey
  IdentitiesOnly yes
  ForwardAgent no
  ForwardX11 no
  ForwardX11Trusted no

ध्यान दें कि आदेश मायने रखता है और Host git.company.comप्रतिबंध Match Execएक या एक के बाद दिखाई देना चाहिए ।


0

अपने रिपॉजिटरी का उपयोग करके कॉन्फ़िगर करें git config। उदाहरण के लिए:

git config --add --local core.sshCommand 'ssh -i ~/.ssh/<<<PATH_TO_SSH_KEY>>>'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.