প্রদত্ত ডোমেনের জন্য গিট পুশের জন্য একটি এসএসএইচ কী উল্লেখ করুন


342

আমার নীচের ব্যবহারের কেস রয়েছে: আমি git@git.company.com:gitolite-adminব্যবহারকারীর ব্যক্তিগত কী ব্যবহার করতে চাপ দিতে সক্ষম হতে চাই gitolite-admin, আমি git@git.company.com:some_repoনিজের নিজস্ব ব্যক্তিগত কী ব্যবহার করতে চাই private আফাইক, আমি এটি ব্যবহার করে এটি সমাধান করতে পারি না ~/.ssh/config, কারণ ব্যবহারকারীর নাম এবং সার্ভারের নাম উভয় ক্ষেত্রেই অভিন্ন। আমি বেশিরভাগ আমার নিজের ব্যক্তিগত কী ব্যবহার করেন, আমি যে সংজ্ঞায়িত আছে ~/.ssh/configজন্য git@git.company.com। একক gitঅনুরোধের জন্য ব্যবহৃত কীটি ওভাররাইড করার কোনও উপায় কি কেউ জানেন ?

(পাশাপাশি: গিটোলাইট কীটির উপর ভিত্তি করে কারা চাপ দিচ্ছে তা পৃথক করে, তাই অ্যাক্সেস, মালিকানা এবং নিরীক্ষণের ক্ষেত্রে এটি কোনও সমস্যা নয় যে ব্যবহারকারী @ সার্ভার স্ট্রিংটি বিভিন্ন ব্যবহারকারীর জন্য অভিন্ন))


উত্তর:


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:

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
অান্তরিক ধন্যবাদ. আমি বুঝতে পারি নি যে আপনি নির্দ্বিধায় alias / .ssh / কনফিগারেশনে হোস্টের স্পেসিফিকেশনের জন্য একটি 'ওরফে' বেছে নিতে পারেন
কনফিউশন

4
এই উত্তরের জন্যও ধন্যবাদ! আমার কাছে একটি লক্ষ্য ছিল যে আইডেন্টিটি ফাইলে একটি সম্পূর্ণ পথ হওয়া দরকার (আমি কেবল আইডেন্টিফাইলে আমার যুক্তি হিসাবে id_rsa.rick রেখেছি এবং এটি ব্যর্থ হয়েছে)। আইডেন্টিটি ফাইলের অন্যান্য সিনট্যাক্সের জন্য ssh_config (5) ম্যান পৃষ্ঠাটি দেখুন।
রিকুমালী

1
পরিষ্কার এবং খুব সহায়ক উত্তরের জন্য আপনাকে অনেক ধন্যবাদ। আমি কিছুক্ষণের জন্য এটি কাজ করার চেষ্টা করেছি এবং একই ব্যবহারকারীকে একই id_rsa প্রাইভেট কী ফাইলটি ব্যবহার করতে হবে এই ধারণা নিয়ে আগেই ছেড়ে দিয়েছিলাম।
ড্রকর্ড

7
git@যেমন দেওয়া হয় দূরবর্তী অংশগ্রহণ প্রয়োজন নেই Userকনফিগ এর লাইন।
ডলম্যান

2
হোস্টের IdentitiesOnly yesসাথে লাইনের পরপরই আমি অন্য একটি লাইন যুক্ত না করা পর্যন্ত আমি এই সমাধানের সাথে লড়াই করছি IdentityFile। দেখে মনে হচ্ছে এটি একাধিক পরিচয়ের পাশ দিয়ে যাচ্ছে এবং এর মধ্যে একটিতে হোস্ট অ্যাক্সেস করতে বাধা দেওয়া হয়েছিল।
ফিটার ম্যান

57

মার্ক লংগায়ারের উপরের প্রস্তাবিত বিকল্পের জন্য একটি বিকল্প পদ্ধতি হ'ল একটি উপাধি ব্যবহার করুন যা কোনও এসএমএইচ কী সহ কোনও রিমোটে যে কোনও গিট কমান্ড চালাবে । ধারণাটি হ'ল গিট কমান্ড চলাকালীন আপনার এসএসএইচ পরিচয় স্যুইচ করা।

অন্যান্য উত্তরে হোস্ট ওরফে পদ্ধতির সাথে সম্পর্কিত সুবিধাগুলি:

  • আপনি স্পষ্টভাবে নির্দিষ্ট করতে না পারলেও কোনও গিট কমান্ড বা উপকরণের সাথে কাজ করবে remote
  • অনেক সংগ্রহস্থলগুলির সাথে কাজ করা সহজ কারণ আপনার প্রতি ক্লায়েন্ট মেশিনে একবার প্রতি সংগ্রহস্থল নয়, প্রতি ক্লায়েন্ট মেশিনে একবার এটি সেট আপ করতে হবে।

আমি কয়েকটি ছোট স্ক্রিপ্ট এবং গিট ওরফে ব্যবহার করি admin। এইভাবে আমি করতে পারি, উদাহরণস্বরূপ:

git admin push 

বিকল্প ("অ্যাডমিন") এসএসএইচ কী ব্যবহার করে ডিফল্ট রিমোটে যেতে। আবার, আপনি pushএই উলামের সাহায্যে কোনও আদেশ (কেবল নয় ) ব্যবহার করতে পারেন । এমনকি আপনি git admin clone ...কোনও সংগ্রহস্থল ক্লোন করতেও করতে পারেন যা আপনার "অ্যাডমিন" কী ব্যবহার করার ক্ষেত্রে আপনার কেবল অ্যাক্সেস থাকবে।

পদক্ষেপ 1: বিকল্প এসএসএইচ কীগুলি তৈরি করুন, আপনি অন্য কারও মেশিনে এটি করছেন এমন ক্ষেত্রে বিকল্পভাবে একটি পাসফ্রেজ সেট করুন।

পদক্ষেপ 2: "ssh-as.sh" নামে একটি স্ক্রিপ্ট তৈরি করুন যা এসএসএইচ ব্যবহার করে এমন স্টাফ চালায়, তবে ডিফল্টের পরিবর্তে প্রদত্ত এসএসএইচ কী ব্যবহার করে:

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

পদক্ষেপ 3: "git-as.sh" নামে একটি স্ক্রিপ্ট তৈরি করুন যা প্রদত্ত এসএসএইচ কী ব্যবহার করে গিট কমান্ড চালায়।

#!/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
খুব সুন্দর উত্তর। নিরাপদ থাকতে চারপাশে $@-> ডাবল উক্তি যুক্ত করতে ভুলবেন না "$@"
কেভিনার্পে

@ সাইনলাও কি এখনও এটি কাজ করে? আমি
অলোক কুমার

55

আপনি গিট পরিবেশের পরিবর্তনশীল ব্যবহার করতে পারেন GIT_SSH_COMMAND। আপনার গিট সংগ্রহস্থলের অধীনে আপনার টার্মিনালে এটি চালান:

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

~/.ssh/your_private_keyআপনি ব্যবহার করতে চান ssh প্রাইভেট কী এর পথ দিয়ে প্রতিস্থাপন করুন। আর তুমি পরবর্তী Git কমান্ড পরিবর্তন করতে পারেন (যেমন হয় git submodule update --init) অন্যদের মত git pull, git fetchইত্যাদি


1
সম্পূর্ণ ডকটি git-scm.com/docs/git#git-codeGITSSHcodeরয়েছে ; যদিও এটির জন্য সাম্প্রতিক গিট প্রয়োজন (> = 2.3। *)।
খ্রিস্টান উলব্রিচ

2
একটি সাধারণ সমাধানের জন্য আপনাকে ধন্যবাদ, যার জন্য একটি পরিবেশের ভেরিয়েবল সেট করা ছাড়া আর কোনও প্রয়োজন নেই।
নোহ সুসমান 21

4
মনে রাখবেন যে আপনার ~ / .ssh / id_rsa (বা আপনার ডিফল্ট কীটি যাই হোক না কেন) আপনি -i এর মাধ্যমে পাস করেছেন তার চেয়ে বেশি প্রাধান্য পাবে। সুতরাং আপনি সত্যিই অন্য কীগুলি উপেক্ষা করার জন্য GIT_SSH_COMMAND = 'ssh -i। / .Ssh / your_private_key -o পরিচয় কেবল = হ্যাঁ' ব্যবহার করতে চান
staktrace

কিভাবে আপনি গিট পুশ আপডেট করতে পারেন? আমি এটি ডকুমেন্টেশনে খুঁজে
পাইনি

বাশ বা গিট এলিয়াসগুলি তৈরি করা ভাল হবে - সাইনলাওর উত্তরের অনুরূপ তবে কোথাও স্ক্রিপ্ট তৈরি না করে এই পদ্ধতিটি ব্যবহার করে।
আইনিগো

14

একটি ইউনিক্স ভিত্তিক সিস্টেম (লিনাক্স, বিএসডি, ম্যাক ওএস এক্স), ডিফল্ট পরিচয় ডিরেক্টরি files HOME / .ssh ডিরেক্টরিতে 2 টি ফাইলে সংরক্ষণ করা হয়: private key: $HOME/.ssh/id_rsa public key: $HOME/.ssh/id_rsa.pub আপনি sshবিকল্প ছাড়াই -iব্যবহার করেন, এটি দূরবর্তী সিস্টেমের সাথে প্রমাণীকরণের জন্য ডিফল্ট প্রাইভেট কী ব্যবহার করে।

আপনার যদি অন্য একটি ব্যক্তিগত কী ব্যবহার করতে চান তবে উদাহরণস্বরূপ $ HOME / .ssh / deploy_key , আপনাকে ব্যবহার করতে হবেssh -i ~/.ssh/deploy_key ...

এটা বিরক্তিকর. আপনি আপনার $ HOME / .Bash_profile এ নিম্নলিখিত লাইনগুলি যুক্ত করতে পারেন : ssh-add ~/.ssh/deploy_key ssh-add ~/.ssh/id_rsa

প্রতিটি সময় আপনি ব্যবহার তাই sshবা gitবা scp(মূলত sshখুব), আপনি বিকল্প ব্যবহার করতে হবে না -iআর।

$ HOME / .bash_profile ফাইলটিতে আপনি নিজের পছন্দ মতো বেশি কী যুক্ত করতে পারেন ।


10

অন্য বিকল্প হ'ল ssh- পরিচয় ব্যবহার করা , আপনার ssh সনাক্তকরণগুলি পরিচালনা করতে

এটি স্বয়ংক্রিয়ভাবে আপনার বর্তমান ওয়ার্কিং ডিরেক্টরি, ssh বিকল্পগুলি এবং এর উপর ভিত্তি করে বিভিন্ন কীগুলি লোড করে এবং ব্যবহার করে ... যার অর্থ আপনার সহজেই একটি কাজ / ডিরেক্টরি এবং প্রাইভেট / ডিরেক্টরি থাকতে পারে যা স্বতন্ত্রভাবে ssh সহ বিভিন্ন কী এবং পরিচয় ব্যবহার করে শেষ হয়।


9

আমি উইন 7 এ গিট ব্যাশ ব্যবহার করছি। নিম্নলিখিত আমার জন্য কাজ করে।

~ / .Ssh / config বা c: / ব্যবহারকারীদের / [আপনার_উজার_নাম] /। এসএসএস / কনফিগারেশনে একটি কনফিগার ফাইল তৈরি করুন। ফাইলটিতে প্রবেশ করুন:

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

আমি অনুমান করি যে হোস্টটি আপনার হোস্টের জন্য কেবল একটি "নাম" বা রেফ নয়, একটি URL হতে হবে। উদাহরণ স্বরূপ,

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

পাথটি / সি / ব্যবহারকারী / [ব্যবহারকারীর নাম] / .... ফর্ম্যাটেও লেখা যেতে পারে

জিওর্ডানো স্কালজো প্রদত্ত সমাধানটিও দুর্দান্ত। https://stackoverflow.com/a/9149518/1738546


9

গিট ২.১০ থেকে উপরের দিকে গিটকনফিগ এসএসকম্যান্ড সেটিংস ব্যবহার করাও সম্ভব। দস্তাবেজ রাজ্য :

যদি এই ভেরিয়েবলটি সেট করা থাকে, গিট ফেচ এবং গিট পুশ এসএসএসের পরিবর্তে নির্দিষ্ট কমান্ডটি ব্যবহার করবে যখন তাদের কোনও দূরবর্তী সিস্টেমে সংযোগের প্রয়োজন হবে। কমান্ডটি 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/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

যতক্ষণ আপনি আপনার সমস্ত কাজের রেপগুলি ~ / dev / work এবং ব্যক্তিগত স্টাফের অধীনে অন্য কোথাও রাখবেন, সার্ভারে টান / ক্লোনস / পুশ করার সময় গিট সঠিক এসএসএইচ কীটি ব্যবহার করবে এবং এটি সমস্তটির সাথে সঠিক ইমেল ঠিকানা সংযুক্ত করবে আপনার প্রতিশ্রুতি

তথ্যসূত্র:


ক্লোনিং দিয়ে এটি কীভাবে কাজ করে? আমি যদি মনে করি includeIfকোন .gitডিরেক্টরি উপস্থিত আছে কেবল তখনই কাজ করা উচিত ?
স্পষ্টত

অপেক্ষা করুন আমি এটি পেয়েছি, এটি ইউআরএল পুনর্লিখন যা তার যত্ন নেয়। এই উত্তর অবিশ্বাস্যভাবে দরকারী!
স্পষ্টত

4

উইন্ডোতে গিটের এসএস-এর সংস্করণ ব্যবহার করা থাকলে, এসএসএস কনফিগারেশনে পরিচয় ফাইল লাইনটি দেখতে ভাল লাগে

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

যেখানে /cজন্যc:

চেক করতে, গিট এর বাশ করতে

cd ~/.ssh
pwd 

3

আপনার ডিফল্ট হোস্ট কনফিগারেশন অপসারণ করতে (বা মন্তব্য করতে) প্রয়োজন হতে পারে .ssh / কনফিগ


1

আপনি ফাইল কনফিগারেশন কী 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)'' ]

এটি [দুটি স্ট্রিং সমান কিনা তা যাচাই করতে বাশ কমান্ড ব্যবহার করে । এই ক্ষেত্রে স্ট্রিংটি কমান্ড 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 দ্বারা উল্লিখিত গিট সার্ভারে কেবল একটি চাবি দেওয়া আছে তা নিশ্চিত করার জন্য আমি এই ঘোষণাটি অন্তর্ভুক্ত করেছি । অন্যান্য ঘোষণাগুলি গিটের জন্য কেবল স্ট্যান্ডার্ড এসএসএস বিকল্প।

আপনি যদি 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>>>'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.