簡體   English   中英

為什么 git 在 Windows 下記不住我的密碼

[英]Why git can't remember my passphrase under Windows

我剛剛開始使用 git,但我無法記住我的密碼我正在使用提升的 cmd.exe,我的 git 主機是 github,我已經創建了一個 ssh 密鑰,就像 github 上的指南一樣

但我仍然得到

*\subnus.mvc>git push origin master
Enter passphrase for key '/c/Users/Subnus/.ssh/id_rsa':

我意識到這個問題是在兩年前提出的,但我遇到了同樣的問題,這里的幾個答案並沒有完全回答我的問題。 以下是三個分步解決方案,具體取決於您是否使用 TortoiseGit 和 msysgit。

第一個解決方案假設 Windows、msysgit 和 PuTTY。

  1. 按照說明安裝 msysgit 和 PuTTY。

  2. (可選)將 PuTTY 添加到您的路徑。 (如果您不這樣做,那么下面對 PuTTY 命令的任何引用都必須以相應可執行文件的完整路徑為前綴。)

  3. 如果您還沒有這樣做,請按照 GitHub 或您的 Git 主機的說明生成密鑰哈希。

  4. 同樣,如果您還沒有這樣做,請使用puttygen.exe轉換您的密鑰以與 PuTTY 的 pageant.exe 一起使用。 說明在 PuTTY 的文檔、這個有用的指南以及網絡空間的其他幾個地方。

  5. 運行 PuTTY 的pageant.exe ,打開您的 .ppk 文件(“添加密鑰”),並為您的密鑰提供密碼。

  6. 訪問 Windows 的環境變量對話框(右鍵單擊“計算機”,單擊“屬性”,單擊“高級系統設置”或“高級”選項卡,單擊“環境變量”)。 添加以下環境變量:

    GIT_SSH=C:\full\path\to\plink.exe

    將 "C:\full\path\to" 替換為 PuTTY 的完整安裝路徑,其中找到 plink.exe。 最好將其添加到“用戶變量”部分。 此外,請確保您用於 plink.exe 的路徑與您用於 Pageant (pageant.exe) 的路徑相匹配。 在某些情況下,您可能安裝了多個 PuTTY,因為它可能與其他應用程序一起安裝。 使用一個安裝中的 plink.exe 和另一個安裝中的 pageant.exe 可能會給您帶來麻煩。

  7. 打開命令提示符。

  8. 如果您嘗試連接到托管在 Github.com 的 git 存儲庫,請運行以下命令:

    plink.exe git@github.com

    如果您嘗試連接的 git 存儲庫托管在其他地方,則將git@github.com替換為適當的用戶名和 URL。 (假設 Github)你應該被告知服務器的主機密鑰沒有被緩存,並詢問你是否信任它。 回答y 這會將服務器的主機密鑰添加到 PuTTY 的已知主機列表中。 如果沒有這一步,git 命令將無法正常工作。 按回車后,Github 會通知您 Github 不提供 shell 訪問。 沒關系……我們不需要它。 (如果您正在連接到其他主機,並且它為您提供了 shell 訪問權限,那么最好終止鏈接而不做任何其他事情。)

  9. 全部完成! Git 命令現在應該可以從命令行運行。 您可能希望 pageant.exe 在啟動時自動加載您的 .ppk 文件,具體取決於您需要它的頻率。

第二種解決方案假設 Windows、msysgit 和 TortoiseGit。

TortoiseGit 帶有 PuTTY 可執行文件和經過特殊修改的 plink 版本(稱為 TortoisePlink.exe),這將使事情變得更容易。

  1. 按照說明安裝 msysgit 和 TortoiseGit。

  2. 如果您還沒有這樣做,請按照 GitHub 或您的 Git 主機的說明生成密鑰哈希。

  3. 同樣,如果您還沒有這樣做,請使用 TortoiseGit 的puttygen.exe轉換您的密鑰以與 TortoiseGit 的 pageant.exe 一起使用。 說明在 PuTTY 的文檔、第一個解決方案中鏈接的有用指南以及網絡空間的其他幾個地方。

  4. 運行 TortoiseGit 的pageant.exe ,打開您的 .ppk 文件(“添加密鑰”)並為您的密鑰提供密碼。

  5. 訪問 Windows 的環境變量對話框(右鍵單擊“計算機”,單擊“屬性”,單擊“高級系統設置”或“高級”選項卡,單擊“環境變量”)。 添加以下環境變量:

    GIT_SSH=C:\full\path\to\TortoisePlink.exe

    將 "C:\full\path\to" 替換為 TortoiseGit 的完整安裝路徑,在該路徑中找到 TortoisePlink.exe。 最好將其添加到“用戶變量”部分。 此外,請確保您用於 TortoisePlink.exe 的路徑與您用於 Pageant (pageant.exe) 的路徑相匹配。 在某些情況下,您可能安裝了多個 PuTTY,因為它可能與其他應用程序一起安裝。 使用 TortoiseGit 安裝中的 TortoisePlink.exe 和不同應用程序的另一個安裝(或獨立 PuTTY 安裝)中的 pageant.exe 可能會給您帶來麻煩。

  6. 全部完成! Git 命令現在應該可以從命令行運行。 當您第一次嘗試連接到您的 git 存儲庫時,您可能會被告知服務器的主機密鑰未緩存,並詢問您是否信任該服務器。 點擊“是”。 (這是運行中的 TortoisePlink.exe。)

    您可能希望 pageant.exe 在啟動時自動加載您的 .ppk 文件,具體取決於您需要它的頻率。

第三種解決方案假定 Windows、msysgit 和本機命令提示符。

  1. 安裝 msysgit
  2. 確保允許在 MS-DOS 命令提示符下使用 git
  3. 運行start-ssh-agent
  4. 輸入 SSH 密碼
  5. 全部完成! Git 命令現在應該可以在本機命令提示符下工作。

每次設置新桌面時,我都會忘記這些說明,所以我在這里添加另一個答案,因為我同樣經常偶然發現它!


像我這樣不耐煩的用戶的快速步驟

  1. 啟用OpenSSH Authentication Agent服務並使其自動啟動。
    • 👉更新👈
    • 使用最新的 Windows 更新Version 10.0.19042.867我不得不重新執行此步驟!
  2. 在命令行上使用ssh-add將您的 SSH 密鑰添加到代理。
  3. 測試 git 集成,如果它仍然要求您輸入密碼,請繼續。
  4. 將環境變量$ENV:GIT_SSH=C:\Windows\System32\OpenSSH\ssh.exe到您的會話中,或永久添加到您的用戶環境中。

詳細步驟:概述

Windows 與 OpenSSH 一起發布已經有一段時間了。 它包括 ssh 與 Git 一起工作的所有必要位,但它似乎仍然需要一些 TLC 才能 100% 無縫工作。 這是我從 Windows 版本 10.0.18362.449 開始成功執行的步驟(您可以通過打開 cmd.exe shell 並鍵入ver來查看您的 Windows 10 版本)。

我在這里假設您已經設置了 SSH 密鑰,並且位於~/.ssh/id_rsa

在您的 Windows 10 機器上啟用 ssh-agent 服務。

  1. 開始-> 輸入“服務”並單擊出現的服務應用程序。
  2. 在列表中找到OpenSSH Authentication Agent服務。
  3. 右鍵單擊OpenSSH Authentication Agent服務,然后選擇“屬性”。
  4. Startup type:更改為Automatic
  5. 單擊Start按鈕將服務狀態更改為Running
  6. 單擊OK關閉對話框,然后關閉 Services 應用程序。

將您的密鑰添加到ssh-agent

  1. 打開您偏好的 shell (我將在本例中使用 Windows Powershell,也適用於 Powershell Core)
  2. 將您的 SSH 密鑰添加到ssh-agentssh-add (如果它與默認值不同,您可以將密鑰的路徑添加為第一個參數)
  3. 如果/在提示時輸入您的密碼。

試試 Git + SSH

  1. 打開你的 shell (同樣,我使用的是 Powershell)並克隆一個 repo。 git clone git@github.com:octocat/Spoon-Knife
  2. 如果您看到此提示,請繼續下一部分:
Enter passphrase for key '/c/Users/your_user_name/.ssh/id_rsa':

設置您的GIT_SSH環境變量

在任何會話中,您都可以簡單地設置此環境變量,並且您的密碼提示將停止出現,ssh 將代表您使用ssh-agent 或者,您可以將密碼永久設置到用戶的環境中。

僅在當前 shell 中設置GIT_SSH

  1. 打開您喜歡的外殼。 (對我來說是Powershell)
  2. 將環境變量 GIT_SSH 設置為適當的ssh.exe$Env:GIT_SSH=$((Get-Command -Name ssh).Source)
  3. 重試上面嘗試 Git + SSH中的步驟。

永久設置GIT_SSH

  1. 打開文件資源管理器。 開始-> 鍵入“文件資源管理器”並在列表中單擊它。
  2. 右鍵單擊“這台電腦”,然后單擊“屬性”。
  3. 點擊“高級系統設置”。
  4. 單擊“環境變量...”按鈕。
  5. 在“您的用戶名的用戶變量”下單擊新建...
  6. Variable name:字段設置為 GIT_SSH
  7. Variable value:字段設置為 path-to-ssh.exe(通常為C:\Windows\System32\OpenSSH\ssh.exe )。
  8. 單擊確定關閉新用戶變量對話框。
  9. 單擊“確定”關閉“環境變量”對話框。
  10. 重試上面嘗試 Git + SSH中的步驟。

請注意,隨着 Windows 10 的進展以及我了解更多,這可能會隨着新的步驟/程序而改變。 我會盡量保持更新,期待評論中的反饋。

如果您在Windows下使用Git bash ,您可以執行以下操作:

eval `ssh-agent -s`
ssh-add ~/.ssh/*_rsa

它會在第二個命令中詢問密碼,就是這樣。 您需要執行的每個附加操作(曾經需要密碼短語)都不會要求您輸入密碼短語(請參見下面屏幕截圖中的示例):

在 Windows 上的 Git bash 中添加密碼短語

對於需要更詳細說明的任何人,請參閱此頁面: http ://help.github.com/working-with-key-passphrases/

問題發布后 5 年、8 個月和 6 天后的一個額外解決方案並不是一個壞主意,所以就這樣吧。

注意:假設您使用的是 Windows 計算機。

  1. 下載git-credential-winstore
  2. 運行! 如果您的PATH環境變量中有 GIT,它應該可以正常工作。 如果不這樣做,請運行git-credential-winstore -i C:\Path\To\Git.exe

下次您嘗試提交到存儲庫時,系統會提示您輸入您的憑據。 應該是這樣的。 在您更改密碼之前,不會再要求您提供憑據。


僅供您參考...您的憑據存儲在 Windows 憑據存儲中

你在哪里存儲我的憑據?

此應用程序僅使用現有的 Windows 憑據存儲來保存您的憑據。 您可以通過轉到控制面板 > 用戶帳戶 > 憑據管理器並選擇“Windows 憑據”來查看存儲的憑據。 以“git:”開頭的條目來自 git-credential-winstore。

那不是git,而是ssh。

我不使用Windows,但是ssh的代理概念可以為您記住密碼短語。 OS X默認情況下啟用了此功能。 您的ssh客戶端可能有一種配置方式。

假設您想使用純Git Bash解決方案而不使用 TortoiseGit 或 PuTTY。 此外,您不想永久存儲您的密碼,因為這幾乎與您在沒有密碼的情況下生成 SSH 密鑰一樣。 但是您仍然想使用一些緩存。

出於緩存目的,使用了ssh-agent進程,它包含在 Git Bash 發行版中。 此過程默認不啟動,因此需要先啟動。 對於要緩存的任何 SSH 密鑰,應使用ssh-add命令將它們添加到此進程中,該命令將提示您輸入密鑰的密碼並將其存儲在內存中。

其他解決方案的缺點:

  • GitHub 文章中的自動啟動ssh-agent會在您啟動 Git Bash 時從一開始就要求輸入密碼,無論您是否需要在此會話中使用 SSH 密鑰。 如果您今天使用本地存儲庫,您可能只想在真正需要時提供密碼(例如,在與遠程存儲庫交互時)。
  • 如果您像GitLab 的文章中那樣使用eval $(ssh-agent -s)啟動ssh-agent ,您可能已經厭倦了每次都輸入它。 最終,您可能已將這兩行添加到.bashrc配置中以自動啟動。 缺點與上述相同,還有一個額外的:每次啟動新的 Git Bash 終端時,您都會獲得一個額外的 ssh-agent 進程(GitHub 的 bash 腳本檢查該進程是否已經啟動)。
  • 就像上面兩個一樣,但尤其是當您為不同的主機擁有單獨的 SSH 密鑰時,例如一個用於 GitHub,另一個用於 GitLab,因此一次性提供它們既煩人又不方便。

因此,此解決方案適用於那些想知道如何讓 Git Bash 在每個 Windows 會話中僅在真正需要時才要求輸入密碼的人。 它類似於 GnuPG 使用default-cache-ttl提交自動簽名的密碼管理行為。

配置 SSH 以在需要時僅使用 Git Bash 請求密碼短語

  1. 首先,我們希望在啟動 Git Bash shell 時自動啟動ssh-agent 我們將為此使用修改后的 GitHub 腳本,因為它會檢查進程是否已經開始,但我們不希望它立即ssh-add密鑰。 該腳本轉到您的~/.bashrc~/.profile~/.bash_profile~是您的用戶主目錄,如C:\Users\Username – 運行cd ~然后pwd讓 Git Bash 將其打印出來):

     ### Start ssh-agent env=~/.ssh/agent.env agent_load_env () { test -f "$env" && . "$env" >| /dev/null ; } agent_start () { (umask 077; ssh-agent >| "$env") # use -t here for timeout . "$env" >| /dev/null ; } agent_load_env # agent_run_state: 0=agent running w/ key; 1=agent w/o key; 2= agent not running agent_run_state=$(ssh-add -l >| /dev/null 2>&1; echo $?) if [ ! "$SSH_AUTH_SOCK" ] || [ $agent_run_state = 2 ]; then agent_start fi unset env
  2. 現在編輯或創建一個~/.ssh/config文件,並為要打開緩存的每個主機節添加一個AddKeysToAgent選項(您也可以通過將指令放在文件開頭的所有主機之前來全局打開它聲明):

     # GitHub.com Host github.com Preferredauthentications publickey IdentityFile ~/.ssh/id_ed25519_github AddKeysToAgent yes # GitLab.com Host gitlab.com Preferredauthentications publickey IdentityFile ~/.ssh/id_ed25519_gitlab AddKeysToAgent yes

    從 ssh config 手冊如果此選項設置為 yes 並且從文件加載密鑰,則密鑰及其密碼將添加到具有默認生命周期的代理,就像通過 ssh-add(1) 一樣。

默認的最長生命周期是永遠或直到ssh-agent進程被終止(從任務管理器手動或在您的 PC 關閉時)。 如果您希望使用有限超時,您可以使用 ssh-agent 的-t參數設置它。 從上面的第一步更改 bash 腳本中的行,例如 30 分鍾的密鑰緩存生命周期:

(umask 077; ssh-agent -t 30m >| "$env")

有關其他時間格式限定符,請參見此處

如果您為密鑰文件設置了密碼,則在連接時始終需要輸入該密碼。 如果您創建一個無密碼密鑰,那么您不必每次都輸入它,但是,任何有權訪問您的密鑰文件的人現在都可以連接到您的 github 帳戶。

ssh-agent 也可以工作。 嘗試運行它,看看它是否會記住您的密碼。

[編輯-誤讀了問題,這是對相關問題的回答。 為后代留下改寫版本]

我的情況是,我試圖推送到托管在我們其中一台服務器上的存儲庫。 每當我嘗試推送時,git 都會詢問我的密碼(nb - 密碼,而不是我私鑰的密碼)。

通過將我的公鑰添加到服務器上的授權密鑰中,我能夠獲得對該服務器的無密碼推送。 而且,因為我的私鑰上沒有密碼(順便說一句,這是不好的做法!)我根本不需要輸入任何內容。

這是將您的公鑰添加到服務器的命令。 它假定用戶git是服務器上的用戶。

cat .ssh/id_rsa.pub | ssh git@GIT_MASTER_IP 'cat >> .ssh/authorized_keys'

您可以通過登錄服務器並手動將您的公鑰附加到~/.ssh/authorized_keys文件中來實現相同的目的

我意識到這已經過了好幾年了,但我偶然發現了這個問題,試圖找到一個解決方案,我找到了適合所有專業水平的東西,所以我想我會分享。

GitHub 提供了一個非常有用的安裝程序,讓一切變得簡單易用: https ://help.github.com/articles/caching-your-github-password-in-git/

您可以在用戶的​​主目錄中創建一個.bashrc文件,例如C:/Users/youruser ,然后放在那里:

env=~/.ssh/agent.env

agent_load_env () { test -f "$env" && . "$env" >| /dev/null ; }

agent_start () {
    (umask 077; ssh-agent >| "$env")
    . "$env" >| /dev/null ; }

agent_load_env

# agent_run_state: 0=agent running w/ key; 1=agent w/o key; 2= agent not running
agent_run_state=$(ssh-add -l >| /dev/null 2>&1; echo $?)

if [ ! "$SSH_AUTH_SOCK" ] || [ $agent_run_state = 2 ]; then
    agent_start
    ssh-add
elif [ "$SSH_AUTH_SOCK" ] && [ $agent_run_state = 1 ]; then
    ssh-add
fi

unset env

每次 bash 運行后都會執行此腳本。 所以你只需要輸入一次密碼,當git-bash啟動時!

某些版本的 bash 需要.bash_profile文件而不是.bashrc ,所以以防萬一克隆.bashrc

copy .bashrc .bash_profile

如果您不介意以明文形式存儲密碼並且使用的是TortoiseGit,則有一個簡單的解決方案。

只需在用戶配置文件目錄中創建_netrc文件-即在Windows 7中為C:\\Users\\MyName\\_netrc 該文件將以以下格式存儲您的登錄信息:

machine bitbucket.org login thisismyname password p455w0rD
machine bitbucket.org login another_account password pwdpwdPWd
machine github.com login thisismynameagain password p455w0rD

我使用TortoisePLink作為SSH客戶端,它可以完美運行。

可以嘗試添加 -k arg ;

ssh-add -k ~/.ssh/id_rsa

確保您的~/.ssh/config包含

UseKeychain yes

這可以防止ssh-add持久化到ssh-agent

Windows:如果您執行了@d3r3kk 中的步驟,但仍然遇到問題,請嘗試以下操作:

視窗:

  • 刪除 .bashrc 文件
  • 此文件通常位於 C:\Users\myusername

如何在 Windows 上正確運行 SSH-Agent

現有的答案都沒有讓我滿意。 根據微軟的說法,這是應該如何完成的:

啟動具有管理員權限的 powershell 控制台:

  • ⊞ Win打開開始菜單,輸入powershell ,按ctr shift enter

將 Windows 中包含的 OpenSSH 添加到PATH變量中:

setx PATH "c:/Windows/System32/OpenSSH/;$Env:PATH;" 

關閉 powershell 終端並打開一個新終端。

輸入以下命令以確保 openssh 代理在后台作為服務運行:

# enable automatic start
Get-Service ssh-agent | Set-Service -StartupType Automatic

# start it now
Start-Service ssh-agent

現在服務應該正在運行,您可以通過以下方式檢查

Get-Service ssh-agent

將您的私鑰加載到 ssh-agent 中,例如

ssh-add $env:USERPROFILE/.ssh/id_rsa

來源: https ://docs.microsoft.com/en-us/windows-server/administration/openssh/openssh_keymanagement#user-key-generation

您現在應該能夠使用您的私鑰,而無需每次都輸入密碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM