You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

远程服务器SSH公钥删除/注释失败,sed命令报错求助

解决远程SSH公钥注释/删除问题

方法1:用awk匹配整行(推荐,无需转义特殊字符)

直接在本地执行以下命令,通过awk精准匹配公钥整行并添加注释:

key=$(cat /opt/key/cluster.pub)
ssh -i key.pem node2 "echo '$key' | awk -v target_key=\$0 '{if (\$0 == target_key) print \"#\" \$0; else print \$0}' /home/cloud-user/.ssh/authorized_keys > /tmp/tmp_auth_keys && mv /tmp/tmp_auth_keys /home/cloud-user/.ssh/authorized_keys"
  • 逻辑:把本地公钥内容传递到远程,用awk逐行对比authorized_keys,匹配到的行首加#,输出到临时文件后替换原文件(避免直接修改导致文件损坏)
  • 优势:不需要处理正则转义,完全匹配整行内容,不会误改其他相似行

方法2:修正sed命令,更换分隔符并转义特殊字符

如果偏好使用sed,需解决分隔符冲突和变量传递问题:

key=$(cat /opt/key/cluster.pub)
# 转义公钥里可能干扰sed的特殊字符(比如|、\)
escaped_key=$(printf '%s' "$key" | sed 's/[|\\]/\\&/g')
ssh -i key.pem node2 "sed -i 's|$escaped_key|#$escaped_key|g' /home/cloud-user/.ssh/authorized_keys"
  • 核心改动:把sed默认的/分隔符换成|(公钥里几乎不会出现这个符号),同时转义公钥里的特殊正则字符,避免破坏sed语法

方法3:基于已上传的公钥文件操作

如果已经把cluster.pub传到远程/tmp/cluster_login.pub,可以用grep定位行号后注释:

ssh -i key.pem node2 "grep -nxFf /tmp/cluster_login.pub /home/cloud-user/.ssh/authorized_keys | cut -d: -f1 | xargs -I{} sed -i '{}s/^/#/' /home/cloud-user/.ssh/authorized_keys"
  • 逻辑:grep -nxFf精准匹配公钥所在行并输出行号,提取行号后用sed给对应行加注释

之前方案的错误原因

  1. 测试1失败原因:
    本地shell会先解析双引号中的$key,公钥里的空格、/、+等特殊字符会直接破坏sed的替换命令结构,导致sed无法识别有效正则表达式。

  2. 测试2失败原因:

    • 变量赋值语法错误:key= cat '/tmp/cluster_login.pub'应该写成key=$(cat '/tmp/cluster_login.pub'),否则key变量为空,cat的内容直接输出到标准输出
    • 公钥中的/和sed默认的/分隔符冲突,导致sed报错"unknown option to `s'"

内容的提问来源于stack exchange,提问作者SARATH CHANDRAN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 13:42:41