日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Git之深入解析凭证存储

發(fā)布時(shí)間:2024/5/21 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Git之深入解析凭证存储 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
  • 了解了管理或者維護(hù) Git 倉庫、實(shí)現(xiàn)代碼控制所需的大多數(shù)日常命令和工作流程,嘗試跟了蹤和提交文件的基本操作,并且掌握了暫存區(qū)和輕量級地分支及合并的威力。如果想進(jìn)一步對 Git 深入學(xué)習(xí),可以學(xué)習(xí)一些 Git 更加強(qiáng)大的功能,這些功能可能并不會在日常操作中使用,但在某些時(shí)候可能還是會起到一定的關(guān)鍵性作用。
  • 如果還不清楚 Git 的基礎(chǔ)使用流程、分支的管理、托管服務(wù)器的技術(shù)以及分布式工作流程等相關(guān)的技術(shù)和能力,請參考博客:
    • Git之深入解析Git的安裝流程與初次運(yùn)行Git前的環(huán)境配置;
    • Git之深入解析本地倉庫的基本操作·倉庫的獲取更新和提交歷史的查看撤銷以及標(biāo)簽別名的使用;
    • Git之深入解析Git的殺手級特性·分支管理與變基的開發(fā)工作流以及遠(yuǎn)程分支的跟蹤;
    • Git之深入解析如何運(yùn)行自己的Git倉庫托管服務(wù)器;
    • Git之深入解析如何使用Git的分布式工作流程與如何管理多人開發(fā)貢獻(xiàn)的項(xiàng)目。
  • 如果使用的是 SSH 方式連接遠(yuǎn)端,并且設(shè)置了一個(gè)沒有口令的密鑰,這樣就可以在不輸入用戶名和密碼的情況下安全地傳輸數(shù)據(jù)。然而,這對 HTTP 協(xié)議來說是不可能的,每一個(gè)連接都是需要用戶名和密碼的,這在使用雙重認(rèn)證的情況下會更麻煩,因?yàn)樾枰斎胍粋€(gè)隨機(jī)生成并且毫無規(guī)律的 token 作為密碼。
  • 幸運(yùn)的是,Git 擁有一個(gè)憑證系統(tǒng)來處理這個(gè)事情,如下所示:
    • 默認(rèn)所有都不緩存,每一次連接都會詢問你的用戶名和密碼;
    • “cache” 模式會將憑證存放在內(nèi)存中一段時(shí)間,密碼永遠(yuǎn)不會被存儲在磁盤中,并且在15分鐘后從內(nèi)存中清除;
    • “store” 模式會將憑證用明文的形式存放在磁盤中,并且永不過期,這意味著除非修改了在 Git 服務(wù)器上的密碼,否則永遠(yuǎn)不需要再次輸入憑證信息,這種方式的缺點(diǎn)是密碼是用明文的方式存放在 home 目錄下;
    • 如果使用的是 Mac,Git 還有一種 “osxkeychain” 模式,它會將憑證緩存到系統(tǒng)用戶的鑰匙串中,這種方式將憑證存放在磁盤中,并且永不過期,但是是被加密的,這種加密方式與存放 HTTPS 憑證以及 Safari 的自動填寫是相同的;
    • 如果使用的是 Windows,可以安裝一個(gè)叫做 “Git Credential Manager for Windows” 的輔助工具,這和上面說的 “osxkeychain” 十分類似,但是是使用 Windows Credential Store 來控制敏感信息,可以在 Git-Credential-Manager-for-Windows下載。
  • 可以設(shè)置 Git 的配置來選擇上述的一種方式:
$ git config --global credential.helper cache
  • 部分輔助工具有一些選項(xiàng),“store” 模式可以接受一個(gè) --file 參數(shù),可以自定義存放密碼的文件路徑(默認(rèn)是 ~/.git-credentials )。 “cache” 模式有 --timeout 參數(shù),可以設(shè)置后臺進(jìn)程的存活時(shí)間(默認(rèn)是 “900”,也就是 15 分鐘)。 如下所示,是一個(gè)配置 “store” 模式自定義路徑的例子:
$ git config --global credential.helper 'store --file ~/.my-credentials'
  • Git 甚至允許配置多個(gè)輔助工具,當(dāng)查找特定服務(wù)器的憑證時(shí),Git 會按順序查詢,并且在找到第一個(gè)回答時(shí)停止查詢。當(dāng)保存憑證時(shí),Git 會將用戶名和密碼發(fā)送給所有配置列表中的輔助工具,它們會按自己的方式處理用戶名和密碼。如果在閃存上有一個(gè)憑證文件,但又希望在該閃存被拔出的情況下使用內(nèi)存緩存來保存用戶名密碼,.gitconfig 配置文件如下:
[credential]helper = store --file /mnt/thumbdrive/.git-credentialshelper = cache --timeout 30000

底層實(shí)現(xiàn)

  • 這些是如何實(shí)現(xiàn)的呢? Git 憑證輔助工具系統(tǒng)的命令是 git credential,這個(gè)命令接收一個(gè)參數(shù),并通過標(biāo)準(zhǔn)輸入獲取更多的參數(shù)。
  • 假設(shè)已經(jīng)配置好一個(gè)憑證輔助工具,這個(gè)輔助工具保存了 mygithost 的憑證信息,如下,是一個(gè)使用 “fill” 命令的會話,當(dāng) Git 嘗試尋找一個(gè)服務(wù)器的憑證時(shí)就會被調(diào)用:
$ 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=unknownhostUsername for 'https://unknownhost': bob Password for 'https://bob@unknownhost': protocol=https host=unknownhost username=bob password=s3cre7
  • 分析說明:
    • (1) 這是開始交互的命令;
    • (2) Git-credential 接下來會等待標(biāo)準(zhǔn)輸入,我們提供所知道的信息:協(xié)議和主機(jī)名;
    • (3) 一個(gè)空行代表輸入已經(jīng)完成,憑證系統(tǒng)應(yīng)該輸出它所知道的信息;
    • (4) 接下來由 Git-credential 接管,并且將找到的信息打印到標(biāo)準(zhǔn)輸出;
    • (5) 如果沒有找到對應(yīng)的憑證,Git 會詢問用戶的用戶名和密碼,將這些信息輸入到在標(biāo)準(zhǔn)輸出的地方(這個(gè)例子中是同一個(gè)控制臺)。
  • 憑證系統(tǒng)實(shí)際調(diào)用的程序和 Git 本身是分開的;具體是哪一個(gè)以及如何調(diào)用與 credential.helper 配置的值有關(guān)。 這個(gè)配置有多種格式:
配置值行為
foo執(zhí)行 git-credential-foo
foo -a --opt=bcd執(zhí)行 git-credential-foo -a --opt=bcd
/absolute/path/foo -xyz執(zhí)行 /absolute/path/foo -xyz
!f() { echo “password=s3cre7”; }; f! 后面的代碼會在 shell 執(zhí)行
  • 上面描述的輔助工具可以被稱做 git-credential-cache、git-credential-store 之類,我們可以配置它們來接受命令行參數(shù),通常的格式是 “git-credential-foo [args] ” 標(biāo)準(zhǔn)輸入/輸出協(xié)議和 git-credential 一樣,但它們使用的是一套稍微不太一樣的行為:
    • get 是請求輸入一對用戶名和密碼;
    • store 是請求保存一個(gè)憑證到輔助工具的內(nèi)存;
    • erase 會將給定的證書從輔助工具內(nèi)存中清除。
  • 對于 store 和 erase 兩個(gè)行為是不需要返回?cái)?shù)據(jù)的(Git 也會忽略掉)。然而對于 get,Git 對輔助工具的返回信息十分感興趣,如果輔助工具并不知道任何有用的信息,它就會直接退出而沒有任何輸出,但如果知道的話,它就會在已存儲信息的基礎(chǔ)上擴(kuò)充所提供的信息,它的輸出可看做一系列賦值語句,提供的任何內(nèi)容都會取代 Git 已知的內(nèi)容。
  • 如果輔助工具沒有任何有用的信息,它可以直接退出而不需要輸出任何東西,但如果它有這些信息,它在提供的信息后面增加它所擁有的信息,這些輸出會被視為一系列的賦值語句;每一個(gè)提供的數(shù)據(jù)都會將 Git 已有的數(shù)據(jù)替換掉。
  • 這有一個(gè)和上面一樣的例子,但是跳過了 git-credential 這一步,直接到 git-credential-store:
$ 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=mygithostusername=bob (3) password=s3cre7
  • 分析說明:
    • (1) 告訴 git-credential-store 去保存憑證:當(dāng)訪問 https://mygithost 時(shí)使用用戶名 “bob”,密碼是 “s3cre7”;
    • (2) 現(xiàn)在取出這個(gè)憑證,我們提供連接這部分的信息(https://mygithost)以及一個(gè)空行;
    • (3) git-credential-store 輸出我們之前保存的用戶名和密碼。
  • ~/git.store 文件的內(nèi)容類似:
https://bob:s3cre7@mygithost
  • 僅僅是一系列包含憑證信息 URL 組成的行。 osxkeychain 和 wincred 輔助工具使用它們后端存儲的原生格式,而 cache 使用它的內(nèi)存格式(其他進(jìn)程無法讀取)。

自定義憑證緩存

  • 已經(jīng)知道 git-credential-store 之類的是和 Git 是相互獨(dú)立的程序,就不難理解 Git 憑證輔助工具可以是任意程序,雖然 Git 提供的輔助工具覆蓋了大多數(shù)常見的使用場景,但并不能滿足所有情況。比如,假設(shè)整個(gè)團(tuán)隊(duì)共享一些憑證,也許是在部署時(shí)使用,這些憑證是保存在一個(gè)共享目錄里,由于這些憑證經(jīng)常變更,所以不想把它們復(fù)制到我們自己的憑證倉庫中。現(xiàn)有的輔助工具無法滿足這種情況;來看看我們?nèi)绾巫约簩?shí)現(xiàn)一個(gè),這個(gè)程序應(yīng)該擁有幾個(gè)核心功能:
    • 唯一需要關(guān)注的行為是 get;store 和 erase 是寫操作,所以當(dāng)接受到這兩個(gè)請求時(shí)我們直接退出即可;
    • 共享的憑證文件格式和 git-credential-store 使用的格式相同;
    • 憑證文件的路徑一般是固定的,但我們應(yīng)該允許用戶傳入一個(gè)自定義路徑以防萬一。
  • 我們再一次使用 Ruby 來編寫這個(gè)擴(kuò)展,但只要 Git 能夠執(zhí)行最終的程序,任何語言都是可以的。這是我們的憑證輔助工具的完整代碼:
#!/usr/bin/env rubyrequire '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 argpathend end.parse!exit(0) unless ARGV[0].downcase == 'get' # (2) exit(0) unless File.exists? pathknown = {} # (3) while line = STDIN.getsbreak if line.strip == ''k,v = line.strip.split '=', 2known[k] = v endFile.readlines(path).each do |fileline| # (4)prot,user,pass,host = fileline.scan(/^(.*?):\/\/(.*?):(.*?)@(.*)$/).firstif prot == known['protocol'] and host == known['host'] and user == known['username'] thenputs "protocol=#{prot}"puts "host=#{host}"puts "username=#{user}"puts "password=#{pass}"exit(0)end end
  • 分析說明:
    • (1) 在這里解析命令行參數(shù),允許用戶指定輸入文件,默認(rèn)是 ~/.git-credentials;
    • (2) 這個(gè)程序只有在接受到 get 行為的請求并且后端存儲的文件存在時(shí)才會有輸出;
    • (3) 這個(gè)循環(huán)從標(biāo)準(zhǔn)輸入讀取數(shù)據(jù),直到讀取到第一個(gè)空行,輸入的數(shù)據(jù)被保存到 known 哈希表中,之后需要用到;
    • (4)這個(gè)循環(huán)讀取存儲文件中的內(nèi)容,尋找匹配的行,如果 known 中的協(xié)議和主機(jī)名與該行相匹配,這個(gè)程序輸出結(jié)果并退出。
  • 我們把這個(gè)輔助工具保存為 git-credential-read-only,放到我們的 PATH 路徑下并且給予執(zhí)行權(quán)限。一個(gè)交互式會話類似:
$ git credential-read-only --file=/mnt/shared/creds get protocol=https host=mygithostprotocol=https host=mygithost username=bob password=s3cre7
  • 由于這個(gè)的名字是 “git-” 開頭,所以可以在配置值中使用簡便的語法:
$ git config --global credential.helper 'read-only --file /mnt/shared/creds'
  • 正如看到的,擴(kuò)展這個(gè)系統(tǒng)是相當(dāng)簡單的,并且可以為團(tuán)隊(duì)解決一些常見問題。

總結(jié)

以上是生活随笔為你收集整理的Git之深入解析凭证存储的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。