
讓我們想像以下場景。
ABCDEF1234
我有給定主機名的主機密鑰,因此我的known_hosts
文件如下所示(未散列版本):
example.com ssh-rsa ABCDEF1234
現在我連接到它,主機名稱解析為 10.11.12.13 我收到這樣的訊息
Warning: Permanently added the ECDSA host key for IP address '10.11.12.13' to the list of known hosts.
我的known_hosts 看起來像這樣
example.com ssh-rsa ABCDEF1234
192.0.2.1 ssh-rsa ABCDEF1234
現在幾個月後,example.com
管理員告訴我 RSA 金鑰已被刪除並更改為有利於1234ABCDEF
金鑰。所以我使用刪除有問題的密鑰ssh-keygen -R example.com
,然後我第一次連接,接受密鑰,並知道我的known_host
樣子是這樣的:
192.0.2.1 ssh-rsa ABCDEF1234
example.com ssh-rsa 1234ABCDEF
每次我連接時,我都會收到這條很好的警告訊息:
Warning: the ECDSA host key for 'example.com' differs from the key for the IP address '192.0.2.1'
Offending key for IP in /home/jenkins/.ssh/known_hosts:162
Matching host key in /home/jenkins/.ssh/known_hosts:182
現在想像一下該特定主機名稱有數十或數百個 IP,這需要清理大量的行。一種解決方案是使用來刪除匹配行,但這不是避免弄亂sed
的目標嗎?ssh-keygen -R
sed
sed -i '/ABCDEF1234/d' known_hosts
是否有另一種解決方案,可以從known_host
檔案中刪除與給定金鑰(而不是主機名稱或 IP 位址)關聯的所有條目?
答案1
的目的ssh-keygen -R
不是避免使用sed
,而是刪除例如sed
無法找到的雜湊主機。從ssh-keygen(1):
-R hostname
hostname
從檔案中刪除屬於的所有鍵known_hosts
。此選項對於刪除雜湊主機很有用(請參閱-H
上面的選項)。
-H
對文件進行哈希處理
known_hosts
。這會將指定檔案中的所有主機名稱和位址替換為雜湊表示形式;原始內容被移動到帶有後綴的文件中.old
。這些哈希值通常可以被ssh
和所使用sshd
,但如果文件內容被洩露,它們不會洩露識別資訊。此選項不會修改現有的雜湊主機名,因此可以安全地在混合雜湊名稱和非雜湊名稱的檔案上使用。
注意事項
避免碰撞
請注意,最好使用以 Base64 編碼的完整公鑰,以避免刪除其他密鑰。例如,如果您只使用部分標頭你最終會刪除相同類型的所有鍵:
Base64 | ASCII碼 | 參考號 |
---|---|---|
AAAAE2VjZHNhLXNoYTItbmlzdHAyNTY AAAAIbmlzdHAyNTYAAABBB |
....ecdsa-sha2-nistp256 ....nistp256...A |
RFC 5656,3.1 |
AAAAC3NzaC1lZDI1NTE5AAAAIFKy |
....ssh-ed25519... R² |
RFC 8709, 4 |
AAAAB3NzaC1yc2EAAAADAQABAAABAQ |
...ssh-rsa........... |
RFC 4253,6.6 |
調整您的sed
Base64
Base64 編碼的公鑰包含字元A-Za-z0-9+/=
。由於它可以包含範例/
中使用的sed
,因此您想使用另一個字符,例如:
。
工作範例
在範例中:
- 這
AAAA+OLD/KEY=
是一個佔位符滿的舊的公鑰。 - 這
AAAA+NEW/KEY=
是一個佔位符滿的新的公鑰。
刪除所有具有相同金鑰的主機
使用完整的舊金鑰刪除包含它的所有行:
sed -i ':AAAA+OLD/KEY=:d' ~/.ssh/known_hosts
用新鑰匙取代舊鑰匙
使用完整鍵(舊的和新的)在包含舊鍵的所有行上替換它:
sed -i 's:AAAA+OLD/KEY=:AAAA+NEW/KEY=:g' ~/.ssh/known_hosts
如果金鑰類型也發生變化,則必須將其包含在內,例如,
sed -i 's:ssh-rsa AAAA+OLD/KEY=:ecdsa-sha2-nistp256 AAAA+NEW/KEY=:g' ~/.ssh/known_hosts
刪除主機名稱或 IP 的鍵
這是您將使用的唯一用例ssh-keygen
。
ssh-keygen -R example.com
ssh-keygen -R 192.0.2.1
答案2
首先避免這個問題是一個很好的解決方案。如果known_hosts 沒有填入給定主機名稱的每個IP 的項目,則無需搞亂sed。ssh_keygen -R hostname
足以執行密鑰輪換。
所以我的解決方案是在 ssh 配置中設定CheckHostIP
為。no