是否有命令(或一行代码)可以删除服务器上的 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 上的一行代码,它变成
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
Phil 已经回答了这个问题,但我想做些补充,让你更容易理解。既然你问的是 ssh-copy-id 的反向问题,我假设你想在授权机器上运行它。
ssh 密钥仅包含base64字符。因此,您可以使用不在该列表中的字符作为 sed 分隔符。让我们使用“#”。
ssh root@<hostname> -o PasswordAuthentication=no "sed -i.bak 's#`cat ~/.ssh/id_rsa.pub`##' ~/.ssh/authorized_keys"
用服务器 IP 替换主机名。
如果 PasswordAuthentication 选项要求输入密码,则会导致 ssh 失败