[英]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。
按照說明安裝 msysgit 和 PuTTY。
(可選)將 PuTTY 添加到您的路徑。 (如果您不這樣做,那么下面對 PuTTY 命令的任何引用都必須以相應可執行文件的完整路徑為前綴。)
如果您還沒有這樣做,請按照 GitHub 或您的 Git 主機的說明生成密鑰哈希。
同樣,如果您還沒有這樣做,請使用puttygen.exe轉換您的密鑰以與 PuTTY 的 pageant.exe 一起使用。 說明在 PuTTY 的文檔、這個有用的指南以及網絡空間的其他幾個地方。
運行 PuTTY 的pageant.exe ,打開您的 .ppk 文件(“添加密鑰”),並為您的密鑰提供密碼。
訪問 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 可能會給您帶來麻煩。
打開命令提示符。
如果您嘗試連接到托管在 Github.com 的 git 存儲庫,請運行以下命令:
plink.exe git@github.com
如果您嘗試連接的 git 存儲庫托管在其他地方,則將git@github.com替換為適當的用戶名和 URL。 (假設 Github)你應該被告知服務器的主機密鑰沒有被緩存,並詢問你是否信任它。 回答y 。 這會將服務器的主機密鑰添加到 PuTTY 的已知主機列表中。 如果沒有這一步,git 命令將無法正常工作。 按回車后,Github 會通知您 Github 不提供 shell 訪問。 沒關系……我們不需要它。 (如果您正在連接到其他主機,並且它為您提供了 shell 訪問權限,那么最好終止鏈接而不做任何其他事情。)
全部完成! Git 命令現在應該可以從命令行運行。 您可能希望 pageant.exe 在啟動時自動加載您的 .ppk 文件,具體取決於您需要它的頻率。
第二種解決方案假設 Windows、msysgit 和 TortoiseGit。
TortoiseGit 帶有 PuTTY 可執行文件和經過特殊修改的 plink 版本(稱為 TortoisePlink.exe),這將使事情變得更容易。
按照說明安裝 msysgit 和 TortoiseGit。
如果您還沒有這樣做,請按照 GitHub 或您的 Git 主機的說明生成密鑰哈希。
同樣,如果您還沒有這樣做,請使用 TortoiseGit 的puttygen.exe轉換您的密鑰以與 TortoiseGit 的 pageant.exe 一起使用。 說明在 PuTTY 的文檔、第一個解決方案中鏈接的有用指南以及網絡空間的其他幾個地方。
運行 TortoiseGit 的pageant.exe ,打開您的 .ppk 文件(“添加密鑰”)並為您的密鑰提供密碼。
訪問 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 可能會給您帶來麻煩。
全部完成! Git 命令現在應該可以從命令行運行。 當您第一次嘗試連接到您的 git 存儲庫時,您可能會被告知服務器的主機密鑰未緩存,並詢問您是否信任該服務器。 點擊“是”。 (這是運行中的 TortoisePlink.exe。)
您可能希望 pageant.exe 在啟動時自動加載您的 .ppk 文件,具體取決於您需要它的頻率。
第三種解決方案假定 Windows、msysgit 和本機命令提示符。
start-ssh-agent
每次設置新桌面時,我都會忘記這些說明,所以我在這里添加另一個答案,因為我同樣經常偶然發現它!
OpenSSH Authentication Agent
服務並使其自動啟動。
Version 10.0.19042.867
我不得不重新執行此步驟!ssh-add
將您的 SSH 密鑰添加到代理。$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
OpenSSH Authentication Agent
服務。OpenSSH Authentication Agent
服務,然后選擇“屬性”。Startup type:
更改為Automatic
。Start
按鈕將服務狀態更改為Running
。OK
關閉對話框,然后關閉 Services 應用程序。ssh-agent
ssh-agent
: ssh-add
(如果它與默認值不同,您可以將密鑰的路徑添加為第一個參數) 。git clone git@github.com:octocat/Spoon-Knife
Enter passphrase for key '/c/Users/your_user_name/.ssh/id_rsa':
GIT_SSH
環境變量在任何會話中,您都可以簡單地設置此環境變量,並且您的密碼提示將停止出現,ssh 將代表您使用ssh-agent
。 或者,您可以將密碼永久設置到用戶的環境中。
僅在當前 shell 中設置GIT_SSH
:
ssh.exe
: $Env:GIT_SSH=$((Get-Command -Name ssh).Source)
永久設置GIT_SSH
Variable name:
字段設置為 GIT_SSHVariable value:
字段設置為 path-to-ssh.exe(通常為C:\Windows\System32\OpenSSH\ssh.exe
)。請注意,隨着 Windows 10 的進展以及我了解更多,這可能會隨着新的步驟/程序而改變。 我會盡量保持更新,期待評論中的反饋。
對於需要更詳細說明的任何人,請參閱此頁面: http ://help.github.com/working-with-key-passphrases/
問題發布后 5 年、8 個月和 6 天后的一個額外解決方案並不是一個壞主意,所以就這樣吧。
注意:假設您使用的是 Windows 計算機。
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
命令將它們添加到此進程中,該命令將提示您輸入密鑰的密碼並將其存儲在內存中。
其他解決方案的缺點:
ssh-agent
會在您啟動 Git Bash 時從一開始就要求輸入密碼,無論您是否需要在此會話中使用 SSH 密鑰。 如果您今天使用本地存儲庫,您可能只想在真正需要時提供密碼(例如,在與遠程存儲庫交互時)。eval $(ssh-agent -s)
啟動ssh-agent
,您可能已經厭倦了每次都輸入它。 最終,您可能已將這兩行添加到.bashrc
配置中以自動啟動。 缺點與上述相同,還有一個額外的:每次啟動新的 Git Bash 終端時,您都會獲得一個額外的 ssh-agent 進程(GitHub 的 bash 腳本檢查該進程是否已經啟動)。 因此,此解決方案適用於那些想知道如何讓 Git Bash 在每個 Windows 會話中僅在真正需要時才要求輸入密碼的人。 它類似於 GnuPG 使用default-cache-ttl
提交自動簽名的密碼管理行為。
首先,我們希望在啟動 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
現在編輯或創建一個~/.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 中的步驟,但仍然遇到問題,請嘗試以下操作:
視窗:
現有的答案都沒有讓我滿意。 根據微軟的說法,這是應該如何完成的:
啟動具有管理員權限的 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.