如何防止用於執行 git 操作的 ssh 金鑰在隨後在 Windows 上開啟新終端時僅解密一次?

如何防止用於執行 git 操作的 ssh 金鑰在隨後在 Windows 上開啟新終端時僅解密一次?

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,但這不是我想要的。

我比較喜歡哪個答案

我更喜歡滿足以下標準的答案:

  1. 當 Windows 系統啟動並開啟終端機執行 git 操作時,必須解密一次 ssh 金鑰
  2. 當開啟新終端機時,可以繼續與git儲存庫交互,也就是不會彈出要求輸入密碼的提示。
  3. 我不熱衷於 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://只是一種簡寫,更方便在命令列上鍵入。

相關內容