git - حدد مفتاح SSH الخاص لاستخدامه عند تنفيذ أمر shell؟





bash (16)


لتلخيص الإجابات comments ، فإن أفضل طريقة لإعداد git لاستخدام ملفات أساسية مختلفة ثم نسيانها ، والتي تدعم أيضًا مستخدمين مختلفين لنفس المضيف (على سبيل المثال ، حساب GitHub شخصي ووظيفة واحدة) ، والتي تعمل على Windows كذلك ، هو تحرير ~/.ssh/config (أو c:\Users\<your user>\.ssh\config ) وتحديد هويات متعددة:

Host github.com
HostName github.com
IdentityFile /path/to/your/personal/github/private/key
User dandv

Host github-work
HostName github.com
IdentityFile /path/to/your/work/github/private/key
User workuser

ثم ، لنسخ مشروع كمستخدم شخصي ، فقط قم بتشغيل الأمر git clone العادي.

لاستنساخ الريبو workuser ، قم بتشغيل git clone [email protected]:company/project.git .

قد يكون الوضع غير معتاد ، ولكن أريد تحديد مفتاح SSH خاص لاستخدامه عند تنفيذ أمر shell (git) من الكمبيوتر المحلي.

أساسا مثل هذا:

git clone [email protected]:TheUser/TheProject.git -key "/home/christoffer/ssh_keys/theuser"

أو حتى أفضل (في روبي):

with_key("/home/christoffer/ssh_keys/theuser") do
  sh("git clone [email protected]:TheUser/TheProject.git")
end

لقد رأيت أمثلة للاتصال بخادم بعيد باستخدام Net :: SSH الذي يستخدم مفتاحًا خاصًا محددًا ، لكن هذا أمر محلي. هل هو ممكن؟




مع git 2.10+ (Q3 2016: تم إصداره يوم 2 سبتمبر 2016) ، لديك إمكانية تعيين تهيئة لـ GIT_SSH_COMMAND (وليس فقط متغير بيئة كما هو موضح في answer )

See commit 3c8ede3 (26 يونيو 2016) بواسطة Nguyễn pclouds Duy ( pclouds ) .
(تم دمجها بواسطة Junio ​​C gitster - gitster - in commit dc21164 ، 19 Jul 2016)

تمت إضافة متغير تكوين core.sshCommand جديد core.sshCommand لتحديد قيمة GIT_SSH_COMMAND لاستخدامه في مستودع التخزين.

core.sshCommand:

إذا تم تعيين هذا المتغير ، سيستخدم git fetch و git push الأمر المحدد بدلاً من ssh عندما يحتاجون للاتصال بنظام بعيد.
يكون الأمر في نفس الشكل GIT_SSH_COMMAND بيئة GIT_SSH_COMMAND ويتم تجاوزه عند تعيين متغير البيئة.

هذا يعني أن git clone يمكن أن يكون:

cd /path/to/my/repo
git config core.sshCommand 'ssh -i private_key_file' 
# later on
git clone host:repo.git



عندما تحتاج إلى الاتصال بـ github مع طلب عادي ( git pull origin master ) ، فإن إعداد المضيف كـ * في ~/.ssh/config عمل لي ، أي مضيف آخر (على سبيل المثال ، "github" أو "gb") wasn ' ر العمل.

Host *
    User git
    Hostname github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_xxx



كما هو مذكور هنا: https://superuser.com/a/912281/607049

يمكنك تهيئته في الريبو:

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



ل GITLAB RSAAuthentication yes

Host gitlab.com
  RSAAuthentication yes
  IdentityFile ~/.ssh/your_private_key_name
  IdentitiesOnly yes

الوثيقة هنا




العديد من هذه الحلول بدت جذابة. ومع ذلك ، فقد وجدت نهج البرنامج النصي git-wrapping العام في الرابط التالي الأكثر فائدة:

كيفية تحديد ملف مفتاح ssh باستخدام الأمر git

النقطة هي أنه لا يوجد أمر git مثل ما يلي:

git -i ~/.ssh/thatuserkey.pem clone [email protected]:/git/repo.git

حل Alvin هو استخدام برنامج نصي bash-wrapper محدد بشكل جيد يملأ هذه الفجوة:

git.sh -i ~/.ssh/thatuserkey.pem clone [email protected]:/git/repo.git

أين git.sh هو:

#!/bin/bash

# The MIT License (MIT)
# Copyright (c) 2013 Alvin Abad
# https://alvinabad.wordpress.com/2013/03/23/how-to-specify-an-ssh-key-file-with-the-git-command

if [ $# -eq 0 ]; then
    echo "Git wrapper script that can specify an ssh-key file
Usage:
    git.sh -i ssh-key-file git-command
    "
    exit 1
fi

# remove temporary file on exit
trap 'rm -f /tmp/.git_ssh.$$' 0

if [ "$1" = "-i" ]; then
    SSH_KEY=$2; shift; shift
    echo "ssh -i $SSH_KEY \[email protected]" > /tmp/.git_ssh.$$
    chmod +x /tmp/.git_ssh.$$
    export GIT_SSH=/tmp/.git_ssh.$$
fi

# in case the git command is repeated
[ "$1" = "git" ] && shift

# Run the git command
git "[email protected]"

يمكنني التحقق من أن هذا حل مشكلة كنت أواجهها مع التعرف على المستخدم / المفتاح لريبو بيتبوكيت عن بعد مع git remote update git pull ، git pull ، git clone ؛ كل ذلك يعمل بشكل جيد في نص برمجي cron job الذي كان يواجه مشكلة في التنقل في shell المحدود. كنت أيضا قادرا على استدعاء هذا البرنامج النصي من داخل R ولا يزال حل نفس المشكلة تنفيذ cron نفسه (على سبيل المثال system("bash git.sh -i ~/.ssh/thatuserkey.pem pull") ).

ليس أن R هو نفس روبي ، ولكن إذا كان R يستطيع أن يفعل ذلك ... O :-)




طريقة أفضل لإضافة هذا المضيف أو IP إلى ملف .ssh/config مثل:

Host (a space separated list of made up aliases you want to use for the host)
    User git
    Hostname (ip or hostname of git server)
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_(the key you want for this repo)



في Windows باستخدام Git Bash ، يمكنك استخدام ما يلي لإضافة مخزن ssh-agent bash -c 'ssh-add "key-address"; git remote add origin "rep-address"' ssh-agent bash -c 'ssh-add "key-address"; git remote add origin "rep-address"' على سبيل المثال: ssh-agent bash -c 'ssh-add /d/test/PrivateKey.ppk; git remote add origin [email protected]:test/test.git' ssh-agent bash -c 'ssh-add /d/test/PrivateKey.ppk; git remote add origin [email protected]:test/test.git' which private key is in drive D، folder test of computer. أيضا إذا كنت تريد استنساخ مستودع ، يمكنك تغيير git remote add origin مع git clone .

بعد إدخال هذا إلى Git Bash ، سوف يطلب منك عبارة المرور!

كن على بينة من أن مفتاح المفتاح الخاص و المعجون الخاصان مفتونان!

إذا كنت قد خلقت مفاتيحك مع puttygen ، يجب عليك تحويل مفتاحك الخاص إلى openssh!




أستخدم zsh ويتم تحميل مفاتيح مختلفة إلى ssh-agent shell الخاص ssh-agent تلقائيًا لأغراض أخرى (مثل الوصول إلى الخوادم البعيدة) على الكمبيوتر المحمول الخاص بي. لقد قمت بتعديل جواب نيك وأستخدمه في أحد اشتراكاتي التي تحتاج إلى تحديثها كثيرًا. (في هذه الحالة ، هناك dotfiles التي أريدها وأحدث إصدار عبر جميع أجهزتي ، أينما كنت أعمل.)

bash -c 'eval `ssh-agent`; ssh-add /home/myname/.dotfiles/gitread; ssh-add -L; cd /home/myname/.dotfiles && git pull; kill $SSH_AGENT_PID'
  • تفرخ وكيل ssh
  • إضافة مفتاح للقراءة فقط إلى الوكيل
  • تغيير الدليل إلى بلدي git repo
  • إذا كان cd إلى repo dir ناجحًا ، اسحب من الريبو البعيد
  • قتل أنتجت ssh- وكيل. (لا أريد أن يكون العديد من الوكلاء عالقين.)



إذا كان رقم منفذ SSH ليس 22 (افتراضيًا) ، أضف Port xx في ~/.ssh/config

في حالتي (synology) ،

Host my_synology
    Hostname xxxx.synology.me
    IdentityFile ~/.ssh/id_rsa_xxxx
    User myname
    Port xx

ثم استنساخ باستخدام عنوان المضيف في التكوين. ("my_synology". لتجنبchopstik "*")

git clone my_synology:path/to/repo.git



محتويات my_git_ssh_wrapper:

#!/bin/bash

ssh -i /path/to/ssh/secret/key $1 $2

ثم يمكنك استخدام المفتاح عن طريق القيام بما يلي:

GIT_SSH=my_git_ssh_wrapper git clone [email protected]:TheUser/TheProject.git



يمكنك استخدام متغير بيئة GIT_SSH. ولكنك ستحتاج إلى التفاف ssh والخيارات في برنامج نصي shell.

راجع دليل git: man git في shell command الخاص بك.




اقتراحات الآخرين حول ~/.ssh/config معقدة للغاية. يمكن أن تكون بسيطة مثل:

Host github.com
  IdentityFile ~/.ssh/github_rsa



ذهبت مع متغير البيئة GIT_SSH. وإليك المجمع الخاص بي ، على غرار ذلك من جو بلوك من أعلى ، لكنه يعالج أي كمية من الحجج.

ملف ~ / gitwrap.sh

#!/bin/bash
ssh -i ~/.ssh/gitkey_rsa "[email protected]"

ثم ، في بلدي. bashrc ، أضف ما يلي:

export GIT_SSH=~/gitwrap.sh



يجب أن يعمل شيء مثل هذا (مقترح بواسطة orip):

ssh-agent bash -c 'ssh-add /somewhere/yourkey; git clone [email protected]:user/project.git'

إذا كنت تفضل العناوين الفرعية ، فيمكنك تجربة ما يلي (رغم أنه أكثر هشاشة):

ssh-agent $(ssh-add /somewhere/yourkey; git clone [email protected]:user/project.git)

ستقوم Git باستدعاء SSH الذي سيجد وكيلها حسب متغير البيئة ؛ هذا بدوره ، سيكون المفتاح محملاً.

بدلاً من ذلك ، قد يؤدي تعيين HOME أيضًا إلى الحيلة ، بشرط أن تكون مستعدًا لإعداد دليل يحتوي على دليل .ssh فقط باعتباره HOME ؛ قد يحتوي ذلك على identity.pub أو إعداد ملف التهيئة IdentityFile.




إذا كان الجهاز A هو مربع Windows ، يمكنك استخدام Plink (جزء من PuTTY ) مع المعلمة -m ، وسيقوم بتنفيذ البرنامج النصي المحلي على الخادم البعيد.

plink [email protected] -m local_script.sh

إذا كان الجهاز A نظامًا قائمًا على نظام Unix ، فيمكنك استخدام:

ssh [email protected] 'bash -s' < local_script.sh

لا يجب عليك نسخ النص البرمجي إلى الخادم البعيد لتشغيله.





git bash shell ssh