Linux
在我的 Linux 系統上,我每次啟動系統時都會解密一個 ssh 私鑰。啟動後,我打開一個終端並發出:
ssh-add ~/.ssh/id_rsa_some_key
我已準備好執行 git 操作,例如git clone <git-url>
等等git pull -a
。當我打開另一個終端機並再次發出此類命令時,不會彈出要求輸入加密 ssh-key 密碼的提示。總而言之,在我的linux系統上我只需要輸入一次密碼。
視窗
在我的工作中,我有一個Windows系統。啟動後,我打開git-bash並發出:
eval $(ssh-agent)
然後ssh-add ~/.ssh/private_key
,輸入密碼並發出能夠與 git 儲存庫通訊的 git 命令。與我的 Linux 系統相反,當我開啟新的 git-bash 並發出 git 命令時,會出現一個提示,要求輸入密碼。總之,當私鑰在 git-bash 終端中被解密時,就可以與 git 儲存庫進行交互,但是當開啟新終端時,ssh 金鑰應該再次解密。
我嘗試了什麼
我嘗試使用選美。第一個問題是 id_rsa 不合適。必須使用 puttygen 建立新金鑰,但後來發現無法使用以 git@ 開頭的 ssh git url。它必須替換為 https url,但這不是我想要的。
我比較喜歡哪個答案
我更喜歡滿足以下標準的答案:
- 當 Windows 系統啟動並開啟終端機執行 git 操作時,必須解密一次 ssh 金鑰
- 當開啟新終端機時,可以繼續與git儲存庫交互,也就是不會彈出要求輸入密碼的提示。
- 我不熱衷於 git-bash。如果 Windows 上有另一個終端符合前兩個條件,那麼我就可以了。
答案1
命令
eval $(ssh-agent)
啟動 SSH 代理程式(相當於 Pageant),通常會建立兩個環境變數:SSH_AUTH_SOCK 和 SSH_AGENT_PID(至少在 Linux 上,不知道 Windows git-bash 在這裡是否有任何區別;可能沒有)。
如果設定了 SSH_AUTH_SOCK 變數並指向有效的身份驗證代理套接字,則任何可以讀取該變數的程序都可以使用它。所以你只需要一種方法來讓這個變數的值從一個 git-bash 會話傳播到另一個。 SSH_AGENT_PID 變數只是為了方便,允許在需要時輕鬆殺死代理。
如果您可以將這些環境變數(甚至只是 SSH_AUTH_SOCK)儲存在檔案中,以便後續的 git-bash 視窗可以讀取它,您可以按以下方式編寫腳本:
每當一個新的 git-bash 啟動時(即使用.bashrc
腳本或其等效的 git-bash)
- 檢查SSH代理環境變數檔案是否存在
- 如果文件存在:
- 閱讀
- 如果檔案中列出的代理套接字(以及可選的進程)仍然存在,則在當前會話中按原樣使用變數
- 否則(即如果文件不存在或其資訊已過時):
- 跑步
eval $(ssh-agent)
- 建立新的 SSH 代理環境變數文件
- 跑步
- 完畢!
另外,您可能需要輸入完整形式的 SSH git URL,也就是說,[email protected]/project.git
您應該像這樣輸入,而不是只輸入:
ssh://[email protected]/project.git
從技術上講,不帶前綴的形式ssh://
只是一種簡寫,更方便在命令列上鍵入。