5 分鐘學會 SSH Config:輕鬆管理你的所有伺服器金鑰

很多人為了方便管理,會把預設的 SSH 私鑰檔名從 id_rsa 改成更有辨識度的名稱,例如 id_rsa_personal。沒想到改完名後,原本可以秒連的伺服器突然都跳出權限錯誤。這不是因為金鑰失效,而是因為 SSH 客戶端「迷路」了。

為什麼改名後會連線失敗?

SSH 客戶端在發起連線時,預設只會自動尋找幾個固定名稱的檔案,像是 id_rsaid_ecdsa 或 id_ed25519。一旦你將檔案改名,原本依賴自動偵測的機制就會找不到對應的私鑰,導致連線被拒絕。

要修復這個問題,你不需要把檔名改回去,而是要學會使用 SSH 的「地圖」——也就是 config 檔案。

使用 Config 建立通用對應規則

你可以透過編輯 ~/.ssh/config 檔案,告訴 SSH 客戶端你的金鑰躲在哪裡。請在該檔案中加入以下設定:

Host *
  IdentityFile ~/.ssh/id_rsa_personal

這段設定的意思是:無論連線到哪一個網域(Host *),如果找不到特定的金鑰,就統一嘗試使用這把 id_rsa_personal。這樣一來,原本受影響的站點就能恢復正常連線。

舉例:這就像你在公司設定了一個「預設聯絡人」,不管客戶從哪裡打來,只要沒人接,電話就會自動轉給這個人。

多把金鑰的精確分流做法

如果你手邊有多把金鑰分別對應不同的帳號(例如公司用與私人用),建議採取更精確的分流設定。例如,針對 GitHub 使用特定的金鑰,而其他站點則使用另一把:

Host github.com
HostName github.com
IdentityFile ~/.ssh/id_rsa_personal

Host *
IdentityFile ~/.ssh/id_rsa_other

透過這種方式,SSH 就會根據你連線的目標,自動選取正確的「鑰匙」開門,再也不用手動指定。

連線診斷與最後提醒

設定好之後,你可以使用 ssh -v 加上目標網域(例如 ssh -v [email protected])來觀察連線過程。在輸出的冗長資訊中,你會看到 SSH 開始嘗試載入你指定的 IdentityFile

在 Linux 或 WSL 的環境下,系統對金鑰檔案的安全性要求很高。如果你改名後檔案的權限跑掉了,系統會覺得這把鑰匙太危險而拒絕使用。

請檢查你的金鑰權限是否維持在 600(這代表只有你自己可以讀寫)。你可以輸入指令檢查,如果權限不對,連線是絕對不會成功的。

如果你平常有在使用 ssh-agent(這是一個幫你在背景管理鑰匙、讓你不用每次都輸入密碼的小工具),光是改掉檔案名稱是不夠的。

因為管理員的記憶中存的還是舊的名字。改名後,請記得執行 ssh-add ~/.ssh/id_rsa_personal(這裡的檔名請換成你修改後的名字),手動將新檔名的金鑰重新載入到記憶體中,這樣連線時系統才抓得到正確的鑰匙。

管理 SSH 金鑰不該是一件痛苦的事。透過 ~/.ssh/config 檔案,我們不僅能自由為金鑰命名,還能優雅地處理多個帳號的分流連線。下次遇到連線問題時,先檢查一下你的「地圖」(config)設定是否正確吧!


要在 SSH 設定檔中針對特定服務(如 Azure)的所有連線統一使用同一把金鑰,最有效的方法是利用 通配符(Wildcards)

由於 Azure 的主機名稱通常具有一定的規律(例如 *.cloudapp.azure.com 或特定的伺服器命名前綴),你可以透過 Host 指令來進行精確分流。

1. 針對特定網域進行分流

如果你連線的是 Azure 的公用位址,通常會帶有固定的後綴。你可以這樣設定:

# 針對所有 Azure 雲端應用程式網域
Host *.cloudapp.azure.com *.azure.com
    IdentityFile ~/.ssh/id_rsa_azure
    User azureuser

# 針對其他所有連線
Host *
    IdentityFile ~/.ssh/id_rsa_personal

2. 針對特定 IP 區段進行分流

如果你的 Azure 主機沒有網域名稱,而是使用特定的 IP 範圍(例如 13.x.x.x),你可以使用通配符匹配 IP:

# 針對 13.75.*.* 開頭的所有 IP
Host 13.75.*.*
    IdentityFile ~/.ssh/id_rsa_azure

3. 使用自定義別名(最推薦的做法)

如果你有多台 Azure 主機,與其記住複雜的 IP,不如在 .ssh/config 中定義一個命名慣例(例如所有 Azure 主機都以 az- 開頭):

# 只要連線對象是以 "az-" 開頭的別名
Host az-*
    IdentityFile ~/.ssh/id_rsa_azure
    User azureuser

說明: User 指定帳號滿方便, 反正也不會是其他帳號.

連線方式:

假設你有兩台主機,分別是 13.75.1.113.75.1.2,你只需在 config 增加:

Host az-web
    HostName 13.75.1.1

Host az-db
    HostName 13.75.1.2

執行 ssh az-webssh az-db 時,它們都會因為符合 az-* 的規則而自動抓取 id_rsa_azure 這把鑰匙。


💡 關鍵小撇步:IdentitiesOnly

當你有非常多把金鑰時,有時候 SSH 會嘗試每一把金鑰,導致被伺服器誤判為攻擊而拒絕連線。建議在 Host * 或特定的設定中加入 IdentitiesOnly yes

Host *
    IdentitiesOnly yes
    IdentityFile ~/.ssh/id_rsa_default

這會強制 SSH 只使用設定檔中指定的金鑰,而不是去讀取 ssh-agent 裡面的所有金鑰。

這樣設定後,你的 Azure 連線就會像「專車專用」一樣,既精確又不會與公司或私人的 GitHub 金鑰混淆了。

發佈留言

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