git push 每次都要輸入密碼鎖(passphrase)的解法

之前產生的 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 的開發者來說,是最省心也兼顧安全的方法。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *