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

grm*_*grm 39 ssh

是否有命令(或单行)删除服务器上的 ssh 密钥?类似于 ssh-copy-id 的反面?

小智 36

sed 提供了一个紧凑的解决方案:

sed -i.bak '/REGEX_MATCHING_KEY/d' ~/.ssh/authorized_keys
Run Code Online (Sandbox Code Playgroud)

这会将原始文件保存authorized_keysauthorized_keys.bak. 如果您不想要备份,则只需更改-i.bak-i.

您甚至可以删除多个键:

sed -i.bak '/REGEX1/d; /REGEX2/d' ~/.ssh/authorized_keys
Run Code Online (Sandbox Code Playgroud)

这里唯一棘手的一点是正则表达式中的特殊字符需要转义


小智 11

正如 Ignition 建议的那样,这可以通过grep -v.

这是一个示例,该示例在没有其他密钥时some unique string删除包含或仅删除authorized_keys文件的密钥。

if test -f $HOME/.ssh/authorized_keys; then
  if grep -v "some unique string" $HOME/.ssh/authorized_keys > $HOME/.ssh/tmp; then
    cat $HOME/.ssh/tmp > $HOME/.ssh/authorized_keys && rm $HOME/.ssh/tmp;
  else
    rm $HOME/.ssh/authorized_keys && rm $HOME/.ssh/tmp;
  fi;
fi
Run Code Online (Sandbox Code Playgroud)

替换some unique string为仅存在于您要删除的密钥中的内容。

作为 ssh 上的 oneliner,这变成了

ssh hostname 'if test -f $HOME/.ssh/authorized_keys; then if grep -v "some unique string" $HOME/.ssh/authorized_keys > $HOME/.ssh/tmp; then cat $HOME/.ssh/tmp > $HOME/.ssh/authorized_keys && rm $HOME/.ssh/tmp; else rm $HOME/.ssh/authorized_keys && rm $HOME/.ssh/tmp; fi; fi'
Run Code Online (Sandbox Code Playgroud)

在 Linux (SLES) 和 HP-UX 上测试。

  • 请参阅下面的答案:`sed` 更擅长这样做 (2认同)

Ign*_*ams 7

不。您需要通过 SSH 进入并使用sedgrep从文件中删除密钥。

  • @grm :我建议你永远保持这个问题的开放,或者至少在实施 ssh-undo-copy-id 之前!;-) (2认同)