删除服务器上 ssh 授权密钥的命令

删除服务器上 ssh 授权密钥的命令

是否有命令(或一行代码)可以删除服务器上的 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 登录并使用sedgrep从文件中删除密钥。

答案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 失败

相关内容