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