سؤال كيف يمكن معرفة git أي مفتاح خاص لاستخدام؟


ssh لديه -i خيار معرفة ملف المفتاح الخاص المراد استخدامه عند المصادقة:

-i identity_file

    يختار ملف منه   تتم قراءة الهوية (المفتاح الخاص) لمصادقة RSA أو DSA.   الافتراضي هو ~/.ssh/identity لإصدار البروتوكول 1 ،   و ~/.ssh/id_rsa و ~/.ssh/id_dsa لإصدار البروتوكول 2.   يمكن أيضًا تحديد ملفات الهوية على أساس كل مضيف   في ملف التكوين. من الممكن أن يكون متعدد -i خيارات    (وهويات متعددة محددة في ملفات التكوين).

هل هناك طريقة مماثلة لمعرفة ذلك git أي ملف مفتاح خاص لاستخدامه في نظام مع مفاتيح خاصة متعددة في ~/.ssh دليل؟


497
2018-01-12 18:20


الأصل


نرى هذا السؤال في StackOverflow كذلك. - Flimm
يرتبط أيضا serverfault.com/questions/194567/... - Machavity


الأجوبة:


في ~/.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.SH سترفض ، بطريقة غير واضحة بشكل واضح ، مفاتيح SSH القابلة للقراءة. سوف يبدو فقط مثل رفض الاعتماد. الحل في هذه الحالة هو:

chmod 400 ~/.ssh/id_rsa_github

543
2018-01-12 19:36



ماذا لو كنت بحاجة للاتصال بنفس المضيف بمفاتيح مختلفة؟ - Valentin Klinghammer
Quelltextfabrik - يمكنك إضافة قسم آخر مع مضيف مختلف: nerderati.com/2011/03/... - Ben Challenor
Cliff Nop ، في صفحتي: "HostName: يحدد اسم المضيف الحقيقي لتسجيل الدخول إليه. يمكن استخدام هذا لتحديد أسماء مستعارة أو اختصارات للمضيفين. "إصدار ssh الخاص بي هو openssh-6.7p1. - Grissiom
Grissiom هذا بالضبط ما يقول. لكن يبدو أنك تفهم المعنى إلى الوراء. المضيف (أو المباراة) مطلوب. لإنشاء لقب مضيف ، ضع اللقب في سطر المضيف واسم المضيف الحقيقي في سطر HostName. أمثلة: saltycrane.com/blog/2008/11/... - Cliff
إذا كان ملف التهيئة جديدًا ، فلا تنسَ القيام به chmod 600 ~/.ssh/config - elysch


متغيرات البيئة 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 ، يمكنك تكوين هذا في كل repo أو global ، بحيث لا تضطر إلى تعيين متغير البيئة أي أكثر!

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

238
2018-05-08 09:43



اضطررت الى تصدير الصدف متغير إلى متغير بيئة لجعل هذا العمل ، أي export GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example"، ثم git clone example - Abdull
Abdull في Bash ، قم بتنفيذ الواجب على نفس سطر الأمر تصدير الأمر متغير البيئة لهذا الأمر فقط. جربها: example=hello /usr/bin/env | grep example. - Flimm
أصبحت الأمور أفضل: بدءًا من Git 2.10 ، يمكنك تخزين الأمر في تهيئة Git: stackoverflow.com/a/38474220/520162 - eckes
Noitidart /dev/null هو اسم ملف صالح فقط في أنظمة التشغيل مثل UNIX ، لا يعمل على Windows. - Flimm
إذا كنت بحاجة إلى مفاتيح متعددة ، يمكن تكرار المعلمة -i ، وسيحاول ssh كل مفتاح بدوره. git config core.sshcommand "ssh -i /path/to/keyA -i /path/to/keyB". هذا يتيح بوابة استخدام مفاتيح مختلفة مع مختلف المضيفين البعيد. - Mark


يوجد لا مباشرة طريق يخبر git وهو المفتاح الخاص للاستخدام ، لأنه يعتمد على ssh لتوثيق المستودع. ومع ذلك ، لا يزال هناك بعض الطرق لتحقيق هدفك:

الخيار 1: ssh-agent

يمكنك استخدام ssh-agent لتخويل مفتاحك الخاص بشكل مؤقت.

فمثلا:

$ ssh-agent sh -c 'ssh-add ~/.ssh/id_rsa; git fetch user@host'

الخيار 2: GIT_SSH_COMMAND

قم بتمرير وسيطات ssh باستخدام GIT_SSH_COMMAND متغيرات البيئة (Git 2.3.0+).

فمثلا:

$ GIT_SSH_COMMAND='ssh -i ~/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' \
  git clone user@host

يمكنك كتابة كل هذا على سطر واحد - تجاهل $ وترك خارج \.

الخيار 3: GIT_SSH

قم بتمرير وسيطات ssh باستخدام GIT_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

ملاحظة: الخطوط المذكورة أعلاه هي خطوط أوامر shell (طرفية) والتي يجب لصقها في الطرفية الخاصة بك. سيقومون بإنشاء ملف مسمى ssh، وجعلها قابلة للتنفيذ ، و (بشكل غير مباشر) تنفيذها.

ملحوظة: GIT_SSH متاح منذ v0.99.4 (2005).

الخيار الرابع: ~/.ssh/config

استخدم ال ~/.ssh/config ملف كما هو مقترح في إجابات أخرى من أجل تحديد موقع مفتاحك الخاص ، على سبيل المثال ،

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

70
2018-01-23 22:08



// ، ماذا لو تمت إعادة توجيه هويتك في ssh-agent ، رغم ذلك ، كما في هذا السؤال؟ superuser.com/questions/971732/... - Nathan Basanese
لقد سمحت لي بإعادة صياغة هذا المنصب: IMO يعد هذا أكثر إجابة شاملة. في تصميمه الأصلي ، اقترح المسح السريع الوظيفة التي تصف حل واحد معقد للمشكلة ، لذلك فاتني ذلك. - Alberto
$ ssh-agent sh -c 'ssh-add ~/.ssh/id_rsa; git fetch user@host' عملت لي عندما لا شيء آخر. مجد. - Daniel Dewhurst
اضطررت لاستخدام ~/.ssh/config طريقة ، لم يعمل env vars بالنسبة لي ... - Greg Dubicki
GIT_SSH متاح منذ ذلك الحين v0.99.4 (أغسطس 2005)، وذلك أساسا منذ Git موجود (أبريل 2005). - Dominik


اكتب سيناريو يدعو ssh مع الحجج التي تريدها ، ووضع اسم البرنامج النصي في $GIT_SSH. أو مجرد وضع التكوين الخاص بك ~/.ssh/config.


32
2018-01-12 18:25



تفسير آخر من كيفية القيام بذلك. - Sithsu
~/.ssh/config هو ال الطريق للذهاب. - hek2mgl
أنا أعمل على جهاز (A) منه أنا دفع بوابة إلى الخادم (B) التي لا تقبل سوى مصادقة مفتاح ssh. في حين أن إعداد ~ / .ssh / config على (A) يعمل بشكل جيد عندما أعمل بشكل مباشر على هذا الجهاز ، فإنه لا عندما أقوم بتسجيل الدخول من موقع آخر (C). عن طريق $GIT_SSH وتحل النصي هذه المشكلة. شكر! - bsumirak


إذا كنت لا ترغب في تحديد متغيرات البيئة في كل مرة تقوم فيها بتشغيل git ، فلا تريد برنامجًا ملحقًا آخر ، لا / لا يمكن تشغيل ssh-agent (1) ، ولا تريد تنزيل حزمة أخرى فقط لهذا ، استخدم بوابة -remote-ext (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 - مفيد إذا كنت تريد الاستنساخ / الدفع / السحب غير المراقب (على سبيل المثال في cron)
  • بالتأكيد ، لا حاجة لأداة خارجية

15
2017-07-21 19:44



// ، حل ممتاز. أتساءل ، على الرغم من ذلك ، إذا كان هذا سيسمح لأحد بتحديد هوية مرت من خلال استخدام إعادة توجيه الوكيل. معظم مفاتيحي ليست محلية على الخوادم التي أستخدمها عليها. سألت عن هذا هنا: superuser.com/questions/971732/... - Nathan Basanese
الإجابة تتعامل فقط مع طريقة لتحديد خطوط الأوامر العشوائية ليتم استخدامها كمستودعات git. IMHO ، يجب أن تحاول فرز مشكلتك باستخدام ssh بمفردها أولاً (على سبيل المثال "ssh مضيف"يجب الاتصال باستخدام المفتاح الصحيح". سأحاول تقديم المزيد من المعلومات حول سؤالك الآخر ، مع ذلك. - flaviovs
كان هذا الجواب بالضبط ما احتاجه لإجبار الشيف git المورد لاستخدام مفاتيح النشر الخاصة بالمستودع لاستنساخ / جلب من مستودعات Github الخاصة. الميزة الإضافية لهذه الطريقة على البيئة / النصوص القائمة على السيناريو هي أنه بما أن المسار الرئيسي يتم ترميزه في التهيئة الخاصة بإعادة العمل ، فإنه سيستخدم نفس المفتاح في كل من الاستنساخ الأولي و عمليات الجلب / الدفع اللاحقة. - Adam Franco
رائع! هذا رائع فقط ، لم أكن أعرف عن هذا. شكرا للإجابة ، مفيدة للغاية وكذلك في البيئات الدمية ، لمنع الاضطرابات الإضافية لإدارة .ssh/config الخ +1! - gf_
إذا واجهت الخطأ التالي fatal: transport 'ext' not allowedعليك ان تضغط على البروتوكول البيني عبر export GIT_ALLOW_PROTOCOL=ext. بشكل أساسي ، يتيح المساعد البعيد git-remote-ext (الذي يدعم عناوين URL "ext :: ssh example.com٪ S foo / repo") تنفيذ الأوامر بشكل تعسفي. لا يمثل هذا عادةً مصدر قلق دائمًا لأن المستخدم يراها دائمًا ويثق في عنوان URL الذي يجتازه. ومع ذلك ، فإن الوحدات الفرعية git ، من خلال ملف .gitmodules ، تسمح لمهاجم أن يطلب من العميل جلب عناوين URL git عشوائية. hackerone.com/reports/104465 - Gomino


بعد صراع مع $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

وسيعمل جميع.


13
2018-05-28 17:09



شكر. ما عليك سوى ملاحظة: استخدم "$ @" بدلاً من $ * للوسائط السابقة ، نظرًا لأن سلوكها السابق صحيح عندما تحتوي الوسيطات على مسافة بيضاء. - Piotr Findeisen
تضمين التغريدة ردًا علىPiotrFindeisen ومع ذلك ، أنا لا أفهم ذلك تماما - في zsh أنه يساعدني للحفاظ على سلاسل مع الفضاء في قطعة واحدة ، ولكن في باش لا. هل يمكنك إخباري أكثر أو الإشارة إلى بعض التفسيرات؟ لا أريد إضافة بعض التعديلات بشكل أعمى. - Jan Vlcinsky
يجب عليك إزالة النصف الأول من إجابتك. لا أحد يهتم بحل لا ينفع ، وهو يضيع القراءة التي تشوه الإجابة الصحيحة في الأسفل ، والتي تعمل بشكل رائع. - Cerin
Cerin إذا كنت تقصد إزالة "خطأ لتجنب" سأبقيها هناك. يشترك في شرك مشترك لتجنب و هو قصير جدا. أنا متأكد من أن شخصًا ما سيحاول تحسين الحل من خلال توفير كل الأشياء في المتغير (هذا حدث لي) ، لذلك حاولت تقصير الطريق إلى النجاح. - Jan Vlcinsky


استخدم تهيئة المضيف المخصص في ~/.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  

7
2018-05-17 15:03



هذا هو الجواب الذي كنت أبحث عنه ، حيث لدي حسابات GitHub منفصلة للمنزل والعمل. أنا فقط اضطررت لضبط Host work.github.com  HostName github.com  IdentityFile ~/.ssh/work، ثم استبدل "github.com" بـ "work.github.com" عندما استنسخ مستودع عمل. لا يزال يتصل بـ "github.com" ، ولكن باستخدام زوج مفاتيح غير افتراضي. - Mikkel
عنوان URL لمزيد من التفاصيل ("itblog.study.land / ... ") لا يعمل أي أكثر من ذلك :( - Carl Smotricz


يمكنك فقط استخدام ssh-ident بدلاً من إنشاء الغلاف الخاص بك.

يمكنك قراءة المزيد على:    https://github.com/ccontavalli/ssh-ident

فإنه تحميل مفاتيح سه عند الطلب عند الحاجة الأولى ، مرة واحدة ، حتى مع جلسات تسجيل الدخول متعددة ، xterms أو المنازل المشتركة NFS.

باستخدام ملف تهيئة صغير ، يمكنه تلقائيًا تحميل مفاتيح مختلفة والاحتفاظ بها منفصلة في عوامل مختلفة (لإعادة توجيه الوكيل) استنادًا إلى ما تحتاج إلى القيام به.


5
2018-03-23 01:35





كان لدي عميل يحتاج إلى حساب github منفصل. لذلك كنت بحاجة إلى استخدام مفتاح منفصل فقط لهذا المشروع واحد.

كان الحل الخاص بي لإضافة هذا إلى .zshrc / .bashrc:

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

كلما أردت استخدام بوابة لهذا المشروع ، استبدل "infogit" بـ git:

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

بالنسبة لي ، من الأسهل تذكرها.


4
2018-03-26 19:26