
之前產生的 SSH 金鑰有設定密碼鎖。雖然這比沒設密碼安全,但每次都要輸入確實很麻煩。如果你不想重新產生金鑰,有兩個方法可以解決。
使用 ssh-agent 自動管理
這是最推薦的做法。你可以讓系統在背景跑一個代理程式,幫你記住解鎖後的金鑰。只要在 WSL 終端機執行這兩行指令:
eval $(ssh-agent -s)
ssh-add ~/.ssh/id_rsa_personal
執行第二行時,輸入最後一次密碼。之後只要這個視窗沒關掉,再次 push 就不會再問你密碼。
如果你希望每次開啟 WSL 都自動生效,可以把這兩行指令加到 ~/.bashrc 檔案的最末端。這樣每天第一次開機輸入一次,之後整天都不用再打。
移除金鑰本身的密碼
如果你覺得在私有電腦上不需要這層保護,也可以直接把金鑰的密碼拿掉。執行這行指令:
ssh-keygen -p -f ~/.ssh/id_rsa_personal
系統會先要求你輸入舊密碼。接著會問你新的密碼,這時直接按兩次 Enter 留白。這樣這組金鑰就會變成無密碼狀態,以後執行 git push 就會直接通過。
確認設定是否正確
處理完密碼後,你可以測試一下連線是否正常。輸入:
ssh -T [email protected] -i ~/.ssh/id_rsa_personal
如果看到 Hi 帳號名!You’ve successfully authenticated,就代表搞定了。以後不管 Windows 那邊登入哪個帳號,WSL 這邊都會走你這組專屬的 SSH 金鑰。
如果你使用的是 zsh,要把設定寫在 ~/.zshrc 這個檔案裡。
修改設定檔
你可以使用 nano 或 vim 來編輯:
nano ~/.zshrc
把下面這段程式碼貼到檔案的最末端:
Bash
if [ -z "$SSH_AUTH_SOCK" ]; then
eval $(ssh-agent -s)
ssh-add ~/.ssh/id_rsa_personal
fi
存檔離開後,執行 source ~/.zshrc 讓設定立即生效。這樣你下次開啟新的 zsh 視窗時,系統就會自動啟動代理並載入你的金鑰。
使用 oh-my-zsh 插件
如果你有安裝 oh-my-zsh,其實有一個更優雅的插件做法。在 ~/.zshrc 找到 plugins=(…) 這行,把 ssh-agent 加進去:
plugins=(git ssh-agent)
接著在下面補上一行設定,指定要自動載入的金鑰名稱:
zstyle :omni:plugins:ssh-agent identities id_rsa_personal
這樣它會在你開啟終端機時自動處理一切,不用自己寫 shell script。
解決重複啟動問題
要注意的是,如果直接在設定檔寫 eval,每次開新視窗都會產生一個新的 ssh-agent 處理程序。如果你發現系統變慢,或是用 ps 指令看到一堆 ssh-agent,建議使用上面提到的 if 判斷式,或是安裝 keychain 這個套件來管理。
keychain 會幫你找現有的代理程序,確保整個系統只跑一個 ssh-agent。這對於習慣開多個分頁的人來說,是比較乾淨的做法。
關於 Keychain
keychain 是一個用來管理 ssh-agent 的工具。它的好處是能讓所有開啟的終端機視窗共用同一個 ssh-agent。如果不使用它,你每開一個新的 zsh 分頁,系統可能就會跑一個新的 ssh-agent 程式,久了會變得很亂。
keychain 會在背景記住你解鎖過的金鑰。只要你在第一次登入時輸入過一次密碼,之後不管是重開分頁還是執行 git push,它都不會再煩你。
安裝方式
在 Ubuntu 或 WSL (Ubuntu) 環境下,安裝非常簡單。直接輸入這行指令:
sudo apt update && sudo apt install keychain
安裝完後,它還不會自動運作,需要去修改你的 zsh 設定檔。
設定 zsh 自動執行
你需要把啟動指令加進 ~/.zshrc。請編輯該檔案:
nano ~/.zshrc
在檔案最後面加上這兩行程式碼:
Bash
/usr/bin/keychain --nogui ~/.ssh/id_rsa_personal
source ~/.keychain/$HOST-sh
第一行是叫 keychain 去管理你的那把金鑰。第二行則是載入相關的環境變數,讓目前的 zsh 知道要去哪裡找已經解鎖的金鑰。
實際使用效果
設定完成後,執行 source ~/.zshrc 或是重開視窗。這時候系統會最後一次詢問你金鑰的密碼。
輸入完畢後,這把金鑰就會一直保持在解鎖狀態。就算你開了十個 zsh 視窗,也都只需要輸入那一次密碼。這對頻繁使用 git push 的開發者來說,是最省心也兼顧安全的方法。
在 Windows CMD 環境下,Git 每次 push 都要求輸入密碼鎖,通常是因為 SSH Agent 沒有在背景執行,或是金鑰沒有被正確載入。以下提供兩個主要的解決方案。
使用 Windows 內建的 OpenSSH 服務
這是最推薦的做法,因為它可以讓 SSH Agent 在開機時自動啟動,並持久化儲存你的金鑰密碼。
以管理員身分開啟 PowerShell,執行以下指令將 OpenSSH Authentication Agent 服務設定為自動啟動
Set-Service -Name ssh-agent -StartupType AutomaticStart-Service ssh-agent
回到一般的 CMD 視窗,將你的私鑰加入 Agent。假設你的金鑰路徑是預設值:
ssh-add %USERPROFILE%\.ssh\id_rsa
執行後系統會要求你輸入最後一次密碼鎖。之後只要服務維持執行狀態,重開 CMD 也不需要再輸入密碼。
執行上述指令, 錯誤訊息:
Error connecting to agent: No such file or directory
這個錯誤通常是因為 CMD 無法識別 %USERPROFILE% 後接續的路徑格式,或是 ssh-agent 服務雖然啟動了,但目前的視窗環境變數還沒有對接上。你可以依照以下步驟排查並修正。
修正路徑格式與環境變數
在 CMD 中,路徑的分隔符號與變數引用非常嚴格。請嘗試手動補上反斜線,並加上雙引號確保路徑正確:
ssh-add "%USERPROFILE%\.ssh\id_rsa"
如果依然顯示無法連線到 Agent,請在同一個 CMD 視窗內執行以下指令,手動啟動 Agent 並設定環境變數:
for /f "tokens=1-2 delims==;" %a in ('ssh-agent -s') do set %a=%b
執行完畢後,再次嘗試執行 ssh-add 指令。
確認 SSH 服務執行狀態
如果手動啟動有效,但每次開新視窗都要重來,代表系統服務沒有正確常駐。請再次確認服務狀態:
- 按下 Win + R 鍵,輸入 services.msc 並執行。
- 找到 OpenSSH Authentication Agent。
- 確認狀態為 正在執行,且啟動類型為 自動。
結果是服務被停用, 啟用就好了.

檢查 GIT_SSH 環境變數
有時候安裝 Git 時會內建自家的 SSH 套件,這會干擾系統內建的 ssh-add。請檢查你的環境變數中是否有名為 GIT_SSH 的變數。如果有,請將它刪除,讓 Git 預設使用系統路徑 C:\Windows\System32\OpenSSH\ssh.exe。
另外,請確認你的 .ssh 資料夾內確實存在 id_rsa 這個檔案。你可以輸入 dir %USERPROFILE%.ssh 來查看檔案清單。如果你的金鑰檔名不是 id_rsa (例如是 id_ed25519),請將指令中的檔名更換為正確的名稱。
設定 Git 使用內建的 SSH 工具
有時候 Git 會使用自己打包的 SSH 工具而不是 Windows 系統路徑下的工具,這會導致兩者金鑰紀錄不互通。你可以強制 Git 指向系統的 SSH 路徑:
git config --global core.sshCommand C:/Windows/System32/OpenSSH/ssh.exe
修改金鑰設定移除密碼鎖
如果你覺得維護 Agent 服務太麻煩,且確認電腦環境安全,也可以選擇直接移除私鑰的密碼鎖。
執行以下指令:
ssh-keygen -p -f %USERPROFILE%.ssh\id_rsa
系統會先要求輸入舊密碼,當詢問新密碼時直接按兩次 Enter 留白。這樣該金鑰就會變成無密碼狀態,之後任何 Git 操作都不會再跳出輸入提示。不過請注意,這會降低金鑰外洩時的安全性。
