是否有命令(或單行命令)可以刪除伺服器上的 ssh 密鑰?與 ssh-copy-id 相反的東西?
答案1
正如 Ignatio 所建議的,這可以透過grep -v
.
下面是一個範例,當沒有其他金鑰剩餘時,刪除包含該檔案的金鑰some unique string
或僅刪除該檔案。authorized_keys
if test -f $HOME/.ssh/authorized_keys; then
temp_file=$(mktemp)
if grep -v "some unique string" $HOME/.ssh/authorized_keys > $temp_file; then
cat $temp_file > $HOME/.ssh/authorized_keys && rm $temp_file;
else
rm $HOME/.ssh/authorized_keys && rm $temp_file;
fi;
fi
替換some unique string
為僅存在於您要刪除的密鑰中的內容。
作為透過 ssh 的 oneliner,這變成
ssh hostname 'if test -f $HOME/.ssh/authorized_keys; then temp_file=$(mktemp); if grep -v "some unique string" $HOME/.ssh/authorized_keys > $temp_file; then cat $temp_file > $HOME/.ssh/authorized_keys && rm $temp_file; else rm $HOME/.ssh/authorized_keys && rm $temp_file; fi; fi'
在 Linux (SLES) 和 HP-UX 上進行了測試。
答案2
sed
提供了一個緊湊的解決方案:
sed -i.bak '/REGEX_MATCHING_KEY/d' ~/.ssh/authorized_keys
這會將原始文件保存authorized_keys
在authorized_keys.bak
.如果您不想備份,則只需更改-i.bak
為-i
.
您甚至可以刪除多個鍵:
sed -i.bak '/REGEX1/d; /REGEX2/d' ~/.ssh/authorized_keys
這裡唯一棘手的一點是正規表示式中的特殊字元需要轉義。
答案3
沒有。您需要透過 SSH 登入並使用該金鑰sed
或grep
從該檔案中刪除該金鑰。
答案4
菲爾已經回答了這個問題,但我想補充一下,讓你更容易回答。由於您要求 ssh-copy-id 的反向操作,我假設您想在授權計算機上運行它。
ssh 密鑰僅包含64位基數人物。因此,您可以使用不在該清單中的 char 作為 sed 分隔符號。讓我們使用“#”。
ssh root@<hostname> -o PasswordAuthentication=no "sed -i.bak 's#`cat ~/.ssh/id_rsa.pub`##' ~/.ssh/authorized_keys"
將主機名稱替換為伺服器 IP。
如果詢問密碼,PasswordAuthentication 選項將導致 ssh 失敗