Git
Chapters ▾ 2nd Edition

7.14 Git Alətləri - Etibarlı Yaddaş

Etibarlı Yaddaş

Uzaqdan əlaqə qurmaq üçün SSH transport-dan istifadə etsəniz, istifadəçi adınızı və şifrənizi yazmadan məlumatları etibarlı şəkildə ötürməyinizə imkan verən keçidsiz bir key-in olması mümkündür. Bununla birlikdə, HTTP protokolları ilə bu mümkün deyil - hər əlaqə üçün istifadəçi adı və şifrə lazımdır. Parol üçün istifadə etdiyiniz işarələrin təsadüfi yaradılmış və açıqlanmayan olması iki faktor identifikasiyası olan sistemlər üçün daha da çətinləşir.

Xoşbəxtlikdən, Git bu işdə kömək edə biləcək creditantals sisteminə sahibdir. Git qutusunda bir neçə seçim vardır:

  • Standart olan heç bir şey cache deyil. Hər bir əlaqə istifadəçi adınızı və şifrənizi tələb edəcəkdir.

  • “cache” rejimi creditental-ları müəyyən müddət yaddaşlarda saxlayır. Parolların heç biri diskdə saxlanılmır və 15 dəqiqədən sonra yaddaşdan silinir.

  • “store” rejimi creditental-ları diskdəki düz mətnli bir faylda saxlayır və heç vaxt bitmir. Bu o deməkdir ki, Git host üçün parolunuzu dəyişməyincə, yenidən creditental-nızı təkrar yazmağa məcbur olmayacaqsınız. Bu yanaşmanın mənfi tərəfi odur ki, parollarınız mətndə ev qovluğunuzdakı düz bir sənəddə saxlanılır.

  • Əgər Mac istifadə edirsinizsə, Git sistem hesabınıza daxil edilmiş etibarlı key zəncirində creditental məlumatlarını saxlayan bir “osxkeychain” rejimi ilə gəlir. Bu üsul creditental-larını diskdə saxlayır və heç vaxt bitmir, lakin onlar HTTPS sertifikatları və Safari auto-fill-ləri saxlayan eyni sistemlə şifrələnirlər.

  • Windows istifadə edirsinizsə, “Git Credential Manager for Windows” adlı bir köməkçi quraşdıra bilərsiniz. Onu https://github.com/Microsoft/Git-Credential-Manager-for-Windows-da tapa bilərsiniz.

Git konfiqurasiya dəyərini təyin edərək bu üsullardan birini seçə bilərsiniz:

$ git config --global credential.helper cache

Bu köməkçilərin bəzilərinin də seçimləri var. “store” köməkçisi, plain-text faylının harada saxlandığını təyin edən (standart olan ~/.git-credentials) --file <path> arqumenti götürə bilər. “cache” köməkçisi, demonunun işlədilmə müddətini dəyişdirən --timeout <seconds> seçimi qəbul edir (standart olaraq “900” və ya 15 dəqiqə). “store” köməkçisini xüsusi bir fayl adı ilə necə düzəldəcəyinizə dair bir nümunə:

$ git config --global credential.helper 'store --file ~/.my-credentials'

Git hətta sizə bir neçə köməkçini konfiqurasiya etməyə imkan verir. Müəyyən bir host üçün creditental-ı axtararkən Git bunları qaydasında soruşacaq və ilk cavab verildikdən sonra dayanacaq. Creditental-nı saxlayarkən Git, siyahıdakı köməkçilərin hamısına istifadəçi adı və şifrənizi göndərəcək və sizin onlarla nə edəcəyinizi seçə bilərlər. Budur .gitconfig, thumb drive-da creditental sənədləri faylı olsaydı, ancaq drive qoşulmadığı təqdirdə bəzi yazmaları saxlamaq üçün yaddaş cache-dan istifadə etmək istərdi:

[credential]
    helper = store --file /mnt/thumbdrive/.git-credentials
    helper = cache --timeout 30000

Hood Altında

Bəs bütün bunlar necə işləyir? Git’in creditental-köməkçi sistemi üçün kök əmri, arqument olaraq bir əmr götürən və sonra stdin vasitəsilə daha çox giriş olan git creditental-dır.

Bir nümunə ilə başa düşmək daha asan ola bilər. Tutaq ki, creditental köməkçisi quruldu və köməkçi mygithost üçün creditental-ı saxladı. Budur, Git bir host üçün creditentals-ı tapmaq istəyərkən səslənən “fill” əmrini istifadə edən bir sessiya:

$ git credential fill (1)
protocol=https (2)
host=mygithost
(3)
protocol=https (4)
host=mygithost
username=bob
password=s3cre7
$ git credential fill (5)
protocol=https
host=unknownhost

Username for 'https://unknownhost': bob
Password for 'https://bob@unknownhost':
protocol=https
host=unknownhost
username=bob
password=s3cre7
  1. Bu qarşılıqlı fəaliyyətə başlayan əmr sətridir.

  2. Git-creditental sonra stdin-də giriş gözləyir. Biz onu bildiyimiz şeylərlə təmin edirik: protokol və host adı.

  3. Boş bir xətt girişin tamamlandığını göstərir və creditental sistemi bildikləri ilə cavab verməlidir.

  4. Git-creditental sonra hər şeyi toplayır və tapdığı məlumatlarla stdout yazır.

  5. Creditental-lar tapılmadıqda, Git istifadəçi adını və şifrəsini soruşur və onları yenidən çağıran stdouta təqdim edir (burada eyni console-lara əlavə olunur).

Creditental sistemi, həqiqətən Git-dən ayrı bir proqramı işə salır; hansı və necə olmalı olduğu creditental.helper konfiqurasiya dəyərindən asılıdır. Onun qəbul edə biləcəyi bir neçə forma var:

Configuration Value Behavior

foo

Runs git-credential-foo

foo -a --opt=bcd

Runs git-credential-foo -a --opt=bcd

/absolute/path/foo -xyz

Runs /absolute/path/foo -xyz

!f() { echo "password=s3cre7"; }; f

Code after ! evaluated in shell

Beləliklə, yuxarıda təsvir olunan köməkçilər əslində git-credential-cache, git-credential-store və sair adlandırılmışdır və onları əmr sətri arqumentlərini götürmək üçün konfiqurasiya edə bilərik. Bunun üçün ümumi forma “git-credential-foo [args] <action>.” Stdin/stdout protokolu git-creditental ilə eynidır, lakin onlar bir az fərqli tədbirlər toplusundan istifadə edirlər:

  • get bir istifadəçi adı/parol cütü üçün bir tələbdir.

  • store, bu köməkçinin yaddaşında bir sıra creditentals saxlamaq istəyidir.

  • erase verilmiş xüsusiyyətlərin creditentals-nı bu köməkçinin yaddaşından təmizləmək üçündür.

storeerase hərəkətləri üçün heç bir cavab tələb olunmur (Git buna onsuz da məhəl qoymur). Lakin, get hərəkəti üçün Git köməkçinin söylədiyi fikirlərlə çox maraqlanır. Köməkçi faydalı bir şey bilmirsə, heç bir output olmadan çıxa bilər, ancaq bilirsə, verdiyi məlumatı store-dakı məlumatlarla artırmalıdır. Output bir sıra tapşırıq bəyanatları kimi qəbul edilir; təqdim olunan hər şey Git-in artıq bildiyini əvəz edəcəkdir.git-creditentals

Budur yuxarıdakı misal kimi, ancaq -ı atlayaraq və git-credential-store-a üçün birbaşa getmək:

$ git credential-store --file ~/git.store store (1)
protocol=https
host=mygithost
username=bob
password=s3cre7
$ git credential-store --file ~/git.store get (2)
protocol=https
host=mygithost

username=bob (3)
password=s3cre7
  1. Burada bəzi creditentals-ı saxlamaq üçün git-credential-store-a deyirik: istifadəçi adı “bob” və parol “s3cre7” https://mygithost-a daxil olduqda istifadə edilməlidir.

  2. ndi bu creditentals-ı geri alacağıq. Artıq tanıdığımız əlaqə hissələrini (https://mygithost) və boş bir xətt provide edirik.

  3. git-credential-store yuxarıda saxladığımız istifadəçi adı və şifrə ilə cavablayır.

Budur ~/git.store faylının görünüşü:

https://bob:s3cre7@mygithost

Bunların hər biri özündə creditental ilə bəzədilmiş bir URL olan bir sıra xətlərdir. Bu osxkeychainwincred köməkçiləri öz backing store-larının yerli formatını istifadə edirlər, cache isə öz yaddaş formatını (başqa heç bir proses oxuya bilməz) istifadə edir.

Xüsusi Creditental Cache

git-creditental-store və dostların Git-dən ayrı bir proqram olduğunu nəzərə alsaq, hər hansı bir proqramın Git creditental-ın köməkçisi ola biləcəyini başa düşmək çox çətin deyil. Git tərəfindən təmin olunan köməkçilər bir çox ümumi istifadə hallarını əhatə edir, lakin hamısını deyil. Məsələn, deyək ki, komandanızın, bəlkə də yerləşdirilmə üçün bütün komanda ilə paylaşılan bəzi creditentals-ı var. Bunlar ortaq bir qovluqda saxlanılır, ancaq tez-tez dəyişdikləri üçün onları öz creditental store-a kopyalamaq istəmirsiniz. Mövcud köməkçilərdən heç biri bu işi əhatə etmir; buna görə də özünüzə yazmaq üçün nə lazım olduğuna baxaq. Bu proqramın ehtiyac duyduğu bir neçə əsas xüsusiyyət var:

  1. Diqqət etməli olduğumuz yeganə hərəkət get-dir; storeerase yazma əməliyyatlarıdır, buna görə də, o qəbul olunduqda yalnız təmiz şəkildə çıxacağıq.

  2. Paylaşılan creditentals sənədinin fayl formatı git-credential-store-da istifadə edilənə bənzərdir.

  3. Həmin faylın yeri kifayət qədər standartdır, lakin istifadəçinin yalnız bir halda custom path-i keçməsinə icazə verməliyik.

Bu genişlənməni bird aha Ruby-də yazacağıq, ancaq Git hazır məhsulu işləyə bilənə qədər istənilən dil işləyəcəkdir. Budur yeni creditentals köməkçimizin tam mənbə kodu:

#!/usr/bin/env ruby

require 'optparse'

path = File.expand_path '~/.git-credentials' # (1)
OptionParser.new do |opts|
    opts.banner = 'USAGE: git-credential-read-only [options] <action>'
    opts.on('-f', '--file PATH', 'Specify path for backing store') do |argpath|
        path = File.expand_path argpath
    end
end.parse!

exit(0) unless ARGV[0].downcase == 'get' # (2)
exit(0) unless File.exists? path

known = {} # (3)
while line = STDIN.gets
    break if line.strip == ''
    k,v = line.strip.split '=', 2
    known[k] = v
end

File.readlines(path).each do |fileline| # (4)
    prot,user,pass,host = fileline.scan(/^(.*?):\/\/(.*?):(.*?)@(.*)$/).first
    if prot == known['protocol'] and host == known['host'] and user == known['username'] then
        puts "protocol=#{prot}"
        puts "host=#{host}"
        puts "username=#{user}"
        puts "password=#{pass}"
        exit(0)
    end
end
  1. Burada command-line seçimlərini təhlil edirik, istifadəçiyə giriş faylı göstərməyə imkan verir. Standart bir ~/.git-credentials-dır.

  2. . Bu proqram yalnız hərəkət get olduqda və backing store faylı mövcud olduqda cavab verir.

  3. Bu loop stdin-dən ilk boş sətrə çatana qədər oxunur. Girişlər sonrakı istinad üçün known hash-də saxlanılır.

  4. Bu loop, storage faylının məzmununu oxuyur, uyğunluq axtarır. Known-dan olan protokol və host bu xətlə uyğunlaşırsa, proqram nəticələri stdout-a yazır və çıxış edir.

Köməkçimizi git-credential-read-only olaraq saxlayacağıq, onu PATH-a bir yerə qoyub icra edilə bilən kimi işarələyəcəyik. İnteraktiv seans isə bu tip görünür:

$ git credential-read-only --file=/mnt/shared/creds get
protocol=https
host=mygithost

protocol=https
host=mygithost
username=bob
password=s3cre7

Adı “git-” ilə başladığından, konfiqurasiya dəyəri üçün sadə sintaksisdən istifadə edə bilərik:

$ git config --global credential.helper 'read-only --file /mnt/shared/creds'

Gördüyünüz kimi, bu sistemin uzanması olduqca sadədir və eyni zamanda sizin və komandanız üçün bəzi ümumi problemləri həll edə bilər.