authentication - يتطلب Git push اسم المستخدم وكلمة المرور




github git-push git-pull git-clone (15)

أنا استنسخت مستودع git من حساب جيثب الخاص بي إلى جهاز الكمبيوتر الخاص بي.

أريد العمل مع كل من الكمبيوتر الشخصي والكمبيوتر المحمول ، ولكن مع حساب Github واحد.

عندما أحاول الدفع أو السحب من جيثب باستخدام جهاز الكمبيوتر الخاص بي ، فإنه يتطلب اسم المستخدم وكلمة المرور ، ولكن ليس عند استخدام الكمبيوتر المحمول!

لا أريد كتابة اسم المستخدم وكلمة المرور في كل مرة أتفاعل فيها مع الأصل. ما أنا مفقود هنا؟


Answers

بصرف النظر عن التغيير إلى SSH ، يمكنك أيضًا استخدام HTTPS ، إذا كنت لا تمانع في وضع كلمة المرور بنص واضح. ضع هذا في ~/.netrc ولن يطلب منك اسم المستخدم / كلمة المرور (على الأقل على Linux و Mac):

machine github.com
       login <user>
       password <password>

إضافة (راجع تعليق 2 لـ VonC): على Windows اسم الملف هو %HOME%\_netrc .

اقرأ أيضًا تعليق VonC الأول في حالة رغبتك في التشفير.

إضافة أخرى (انظر تعليق user137717) والتي يمكنك استخدامها إذا كان لديك git 1.7.10 أو أحدث .

تخزين كلمة مرور github في git باستخدام مساعد بيانات اعتماد :

إذا كنت تستنسخ مستودعات GitHub باستخدام HTTPS ، فيمكنك استخدام مساعد بيانات اعتماد لإخبار Git بتذكر اسم المستخدم وكلمة المرور الخاصين بك في GitHub في كل مرة يتحدث فيها مع GitHub.

يعمل هذا أيضًا على Linux و Mac و Windows.


المصدر: إعداد Git

سيحفظ الأمر التالي كلمة المرور الخاصة بك في الذاكرة لبعض الوقت.
(للحصول على بوابة 1.7.10 أو أحدث.)

$ git config --global credential.helper cache
# Set git to use the credential memory cache

$ git config --global credential.helper 'cache --timeout=3600'
# Set the cache to timeout after 1 hour (setting is in seconds)

لقد واجهت المشكلة نفسها للتو ، وكان أبسط حل وجدته هو استخدام عنوان URL الخاص بـ SSH بدلاً من HTTPS:

ssh://[email protected]/username/repo.git

وليس هذا:

https://github.com/username/repo.git

يمكنك الآن التحقق باستخدام SSH Key بدلاً من username password .


إذا لم يعمل مفتاح ssh أو .netrc من أجلك ، فإن حل آخر بسيط ولكنه أقل أمانًا يمكن أن يعمل من أجلك هو git-credential-store - مساعد لتخزين بيانات الاعتماد على القرص

git config --global credential.helper store

افتراضيا سيتم حفظ بيانات الاعتماد في ~/.git-credentials . سيتم إنشاؤه وكتابة ل.

يرجى ملاحظة أن استخدام هذا المساعد سيخزن كلمات المرور الخاصة بك غير مشفرة على القرص ، محميًا فقط من خلال أذونات نظام الملفات. إذا لم يكن هذا مقايضة أمان مقبولة.


كان لي نفس المشكلة.

لذلك قم بتغيير ملف .git / config من مشروعي

url = https://github.com/<your-user-here>/<your-repo-here>

إلى

url = [email protected]:<your-user-here>/<your-repo-here>

وأضف المفتاح العام لـ ssh إلى الملف الشخصي git الموجود في الإعداد.

ل ssh المفتاح العام

cat ~/.ssh/id_rsa.pub

تصديق دائم مع مستودعات Git ،

قم بتشغيل الأمر التالي لتمكين التخزين المؤقت لبيانات الاعتماد :

$ git config credential.helper store
$ git push https://github.com/repo.git

Username for 'https://github.com': <USERNAME>
Password for 'https://[email protected]': <PASSWORD>

يجب أن يحدد الاستخدام أيضًا انتهاء صلاحية التخزين المؤقت ،

git config --global credential.helper 'cache --timeout 7200'

بعد تمكين التخزين المؤقت الوثوقية ، سيتم تخزينها مؤقتًا لمدة 7200 ثانية (ساعتان) .


إذا كنت تستخدم ssh وكان مفتاحك الخاص مشفرًا باستخدام عبارة مرور ، فحينئذٍ ستتم مطالبتك بإدخال عبارة المرور / كلمة المرور للمفتاح الخاص عند القيام بعمليات شبكة مع Git مثل push pull fetch .

استخدم ssh-agent لحفظ بيانات كلمة المرور / كلمة المرور الخاصة بالمفتاح

إذا كنت ترغب في تجنب إدخال عبارة المرور في كل مرة ، فيمكنك استخدام ssh-agent لتخزين بيانات اعتماد كلمة المرور الخاصة بك مرة واحدة لكل جلسة طرفية ، كما أشرح في إجابتي إلى تعذر فتح الاتصال بوكيل المصادقة :

$ eval `ssh-agent -s`
$ ssh-add

في bys msysgit لـ Windows ، تحتاج إلى تقييم إخراج ssh-agent ، ولكن لست متأكدًا إذا كنت بحاجة إلى القيام بنفس الشيء في بيئات التطوير وأنظمة التشغيل الأخرى.

ssh-add يبحث عن مفتاح خاص في مجلد .ssh الخاص بك يدعى id_rsa ، وهو الاسم الافتراضي ، ولكن يمكنك تمرير مسار إلى مفتاح باسم مختلف.

قتل الوكيل

عندما تنتهي من الجلسة الطرفية الخاصة بك ، يمكنك إغلاق ssh-agent بعلامة kill -k :

$ ssh-agent -k

كما هو موضح في دليل ssh-agent :

-k

قتل العامل الحالي (المعطى من قبل متغير بيئة SSH_AGENT_PID).

مهلة اختيارية

أيضًا ، يمكن أن يستغرق الأمر معلمة مهلة اختيارية مثل:

$ ssh-add -t <timeout>

حيث <timeout> من التنسيق <n>h لـ <n> ساعات ، <n>m لـ <n> دقائق ، وهكذا.

حسب دليل ssh-agent :

-t life

قم بتعيين قيمة افتراضية للحد الأقصى من الهويات التي تمت إضافتها إلى العامل. قد يتم تحديد العمر في ثوان أو في تنسيق الوقت المحدد في sshd_config(5) . عمر محدد للهوية مع ssh-add(1) يتجاوز هذه القيمة. بدون هذا الخيار ، يكون الحد الأقصى الافتراضي للعمر هو الأبد.

انظر هذه الصفحة لمزيد من تنسيقات الوقت .

تحذير أمان لمستخدمي Cygwin

يجب على مستخدمي Cygwin أن يكونوا على بينة من مخاطر أمنية محتملة باستخدام ssh-agent في Cygwin :

يجب على الناس أن يكونوا مدركين للأخطار المحتملة لعامل ssh تحت cygwin [1] ، على الرغم من أنه تحت Netstat محلي و portcan عن بعد فإنه لا يبدو أن المنفذ المحدد في / tmp / ssh-foo يمكن لأي شخص الوصول إليه ...؟

[1]: http://www.cygwin.com/ml/cygwin/2001-01/msg00063.html

وعلى الرابط المذكور :

ومع ذلك ، لاحظ أن مآخذ المجال unix cygwin هي INSECURE FUNDAMENTALLY وهكذا أنا بشدة disccoURAGE استخدام ssh-agent تحت cygwin.

عند تشغيل ssh-agent تحت cygwin ، يقوم بإنشاء مأخذ AF_UNIX في /tmp/ssh-$USERNAME/ directory. تحت cygwin يتم محاكاة مآخذ AF_UNIX عبر مآخذ AF_INET. يمكنك بسهولة ملاحظة أنه إذا نظرت إلى /tmp/ssh-$USERNAME/agent-socket-* عبر الملف notepad. سترى شيء من هذا القبيل

!<socket >2080

ثم قم بتشغيل netstat -a ومفاجأة! لديك بعض البرامج التي تستمع إلى المنفذ 2080. إنه ssh-agent. عندما يتلقى ssh تحدي RSA من الخادم ، فإنه يشير إلى المقابلة /tmp/ssh-$USERNAME/agent-socket-* (تحت cygwin ، في حالتنا ، وهذا يعني أنه سيتم فتح الاتصال بـ localhost:2080 ) ويطلب ssh-agent لمعالجة تحدي RSA بالمفتاح الخاص الذي يمتلكه ، وبعد ذلك ببساطة يمر الاستجابة المتلقاة من ssh-agent إلى الخادم.

تحت unix ، يعمل هذا السيناريو دون مشاكل ، لأن unix kernel يتحقق الأذونات عندما يحاول البرنامج الوصول إلى مأخذ توصيل AF_UNIX. من أجل AF_INET مآخذ التوصيل ، على الرغم من ذلك ، يتم اتصالات المجهولة (قراءة "غير آمنة"). تخيل ، أن لديك cygwin ssh-agent قيد التشغيل. يمكن للهاكر الخبيث أن يقوم بمحاكمتك ، وتحديد موقع منفذ مفتوح يستخدمه ssh-agent ، وفتح اتصال بخادم ssh ، وتلقي تحدي RSA منه ، وإرساله إلى ssh-agent عبر منفذ مفتوح وجد ، وتلقي رد RSA ، وإرساله إلى ssh الخادم و voila ، قام بتسجيل الدخول بنجاح إلى الخادم الخاص بك كما كنت.


وهنا خيار آخر:

بدلا من الكتابة

git push origin HEAD

يمكنك أن تكتب:

git push https://user:[email protected]/path HEAD

من الواضح أنه مع معظم القذائف ، سيؤدي ذلك إلى تخزين كلمة المرور مؤقتًا في التاريخ ، لذلك عليك أن تضع ذلك في اعتبارك.


إذا كنت تستخدم git (مثل ghost bash) ضمن Windows (وإذا كنت لا تريد التبديل من https إلى ssh)

يمكنك أيضًا استخدام http://gitcredentialstore.codeplex.com/

سيحتفظ هذا التطبيق باسم المستخدم وكلمة المرور لك ...


ما كان يعمل لي هو تحرير .git/config والاستخدام

[remote "origin"]
        url = https://<login>:<password>@gitlab.com(...).git

وغني عن القول أن هذه طريقة غير آمنة لتخزين كلمة المرور الخاصة بك ولكن هناك بيئات / حالات قد لا يكون فيها هذا مشكلة.


يمكنك تخزين كلمة مرور GitHub الخاصة بك في Git:

فقط اتبع التعليمات من الوثائق الرسمية ل github.

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


بالنسبة إلى الأشخاص غير المستعدين الذين يتم الخلط بينهم وبين الإجابات السابقة ، يمكنك القيام بما يلي:

git remote -v

والتي سوف تستجيب شيء من هذا القبيل

origin  https://[email protected]/yourname/yourrepo.git (fetch)
origin  https://[email protected]/yourname/yourrepo.git (push)

بعد ذلك يمكنك تشغيل الأمر الذي اقترحه العديد من الأشخاص الآخرين ، ولكنك الآن تعرف اسمك و yourrepo من أعلى ، لذلك يمكنك فقط قص ولصق yourname/yourrepo.git من الأعلى إلى

git remote set-url origin [email protected]:yourname/yourrepo.git

لديك أساسا خيارين.

إذا كنت تستخدم نفس المستخدم على كلا الجهازين ، فسيلزمك نسخ مفتاح .pub إلى جهاز الكمبيوتر الخاص بك ، لذا فإن github يعلم أنك أنت نفس المستخدم.

إذا قمت بإنشاء ملف .pub جديد للكمبيوتر الخاص بك وترغب في التعامل مع الأجهزة كمستخدمين مختلفين ، فستحتاج إلى تسجيل ملف .pub الجديد على موقع github.

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

ssh -vv [email protected]

للحصول على مزيد من المعلومات لماذا فشل SSH.


عندما تستخدم https لـ git pull & push ، فقط قم remote.origin.url لمشروعك ، لتجنب إدخال اسم المستخدم (أو / وكلمة المرور) في كل مرة تدفعها.

كيفية التكوين remote.origin.url :

Url format:
    https://{username:[email protected]}github.com/{owner}/{repo}

Parameters in url:
* username
    optional, the username to use when need authentication,
    if specified, no need to enter username again when need authentication,
    don't use email, use your username that has no "@", otherwise the url can't be parsed correctly,
* password
    optional, the password to use when need authentication,
    if specified, no need to enter password again when need authentication,
    tip:
        this value is stored as plain text, so for security concern, don't specify this param,
* 

e.g
    git config remote.origin.url https://[email protected]/eric/myproject

Update - باستخدام ssh

أعتقد أن استخدام بروتوكول ssh هو حل أفضل من https ، على الرغم من أن خطوة الإعداد أكثر تعقيدًا بعض الشيء.

خطوات تقريبية:

  • إنشاء مفاتيح ssh باستخدام الأمر ، على سبيل المثال ssh-keygen على لينكس ، على windows msysgit تقدم أوامر مماثلة.
  • احتفظ بالمفتاح الخاص على الجهاز المحلي في الموقع المناسب ، على سبيل المثال ~/.ssh . وأضفه إلى ssh agent عبر الأمر ssh-add .
  • قم بتحميل المفتاح العام إلى خادم git.
  • قم بتغيير remote.origin.url لمستودع git إلى نمط ssh ، على سبيل المثال [email protected]:myaccount/myrepo.git
  • ثم عند سحب أو دفع ، لا حاجة لإدخال اسم المستخدم أو كلمة المرور من أي وقت مضى.

نصائح:

  • إذا كان مفتاح ssh يحتوي على عبارة مرور ، فأنت بحاجة إلى إدخالها عند الاستخدام الأول للمفتاح بعد كل إعادة تشغيل لجهازك ، بشكل افتراضي.

Update - التبديل بين https وبروتوكول ssh .

ببساطة تغيير remote.origin.url سيكون كافيا ، أو يمكنك تحرير repo_home/.git/config مباشرة لتغيير القيمة (على سبيل المثال باستخدام vi على linux).

عادة ما أقوم بإضافة سطر لكل بروتوكول ، والتعليق على واحد منهم باستخدام # .

على سبيل المثال

[remote "origin"]
        url = [email protected]:myaccount/myrepo.git
        # url = https://[email protected]/myaccount/myrepo.git
        fetch = +refs/heads/*:refs/remotes/origin/*

ما هو الفرق بين git pullو git fetch؟

لفهم هذا ، عليك أولاً أن تفهم أن بوابة git المحلية لا تحتفظ فقط بالمستودع المحلي الخاص بك ، ولكنها تحتفظ أيضًا بنسخة محلية من المستودع البعيد.

git fetchيجلب نسخة محلية من المستودع عن بعد محدثة. على سبيل المثال ، إذا كان مستودع التخزين عن بعد هو GitHub - قد ترغب في إحضار أي تغييرات تم إجراؤها في مستودع التخزين عن بعد إلى نسختك المحلية منه مستودع التخزين عن بعد. سيسمح لك هذا بتنفيذ عمليات مثل المقارنة أو الدمج.

git pullعلى الجانب الآخر ، سيؤدي ذلك إلى خفض التغييرات في المستودع عن بُعد إلى حيث تحتفظ برمزك الخاص. عادةً ، git pullستقوم git fetchأولاً بعمل نسخة محلية من المستودع عن بعد ، ثم تقوم بدمج التغييرات في مستودع التعليمات البرمجية الخاص بك وربما نسخة العمل الخاصة بك.





authentication github git-push git-pull git-clone