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



Answers

لم ينجح أي من هذه الحلول بالنسبة لي.

بدلا من ذلك ، أنا أتحدث عن ذكرMartin v. Löwis من إعداد ملف config ل SSH.

سيبحث SSH عن ملف ~/.ssh/config . لدي إعداد المنجم على النحو التالي:

Host gitserv
    Hostname remote.server.com
    IdentityFile ~/.ssh/id_rsa.github
    IdentitiesOnly yes # see NOTES below

وأضيف مستودع git عن بُعد:

git remote add origin git@gitserv:myrepo.git

ثم تعمل أوامر git بشكل طبيعي بالنسبة لي.

git push -v origin master

ملاحظات

  • IdentitiesOnly yes مطلوبة لمنع السلوك الافتراضي لـ SSH لإرسال ملف الهوية المطابق لاسم الملف الافتراضي لكل بروتوكول. إذا كان لديك ملف اسمه ~/.ssh/id_rsa الذي سيحصل على ~/.ssh/id_rsa قبل ~/.ssh/id_rsa.github بدون هذا الخيار.

المراجع

Question

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

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

git clone git@github.com:TheUser/TheProject.git -key "/home/christoffer/ssh_keys/theuser"

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

with_key("/home/christoffer/ssh_keys/theuser") do
  sh("git clone git@github.com:TheUser/TheProject.git")
end

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




بدءا من Git 2.3.0 لدينا أيضا الأمر البسيط (لا حاجة لملف config):

GIT_SSH_COMMAND='ssh -i private_key_file' git clone host:repo.git



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

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

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

git -i ~/.ssh/thatuserkey.pem clone thatuser@myserver.com:/git/repo.git

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

git.sh -i ~/.ssh/thatuserkey.pem clone thatuser@myserver.com:/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 \$@" > /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 "$@"

يمكنني التحقق من أن هذا حل مشكلة كنت أواجهها مع التعرف على المستخدم / المفتاح لريبو بيتبوكيت عن بعد مع 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 :-)




أستخدم 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



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

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

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



كانت الحيلة بالنسبة لي استخدام git @ hostname بدلاً من http: // hostname




لتلخيص الإجابات 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 git@github-work:company/project.git .




طريقة أفضل لإضافة هذا المضيف أو 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)



Related