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

通过SSH执行kubectl exec时如何保留双引号?

解决远程写入Vault容器policy文件时双引号丢失的问题

问题根源

你的命令经过了三层Shell解析:

  • 本地Shell:执行脚本中的send函数时解析变量和引号
  • 远程机器Shell:处理SSH传递过来的kubectl命令
  • 容器内Shell:执行sh -c后的echo命令

多层解析导致你原来的转义被逐层消耗,最终双引号无法保留到文件中。

可行解决方案

方案1:使用Here Document(推荐)

这种方式无需复杂转义,能直接保留原始内容格式:

#!/bin/sh

function send {
    sshpass -p mypassword ssh -o "UserKnownHostsFile=/dev/null" -o "StrictHostKeyChecking=no" "root@${1}" "${2}"
}

send "${host}" "kubectl -n ${namespace} exec pod/vault-0 -- sh -c 'cat > /tmp/policy.hcl <<\'EOF\'
path "secret/*" { capabilities = ["create", "read", "update", "delete", "list"]}
EOF'"

这里通过<<'EOF'将Here Document的内容设为原样输出,容器内的Shell不会解析内容里的引号和变量,直接写入文件。

方案2:多层转义适配三层Shell

如果坚持用echo命令,需要给双引号添加足够的转义,确保每一层Shell解析后仍能保留双引号:

send "${host}" 'kubectl -n '"${namespace}"' exec pod/vault-0 -- sh -c "echo \"path \\\"secret/*\\\" { capabilities = [\\\"create\\\", \\\"read\\\", \\\"update\\\", \\\"delete\\\", \\\"list\\\"]}\" > /tmp/policy.hcl"'
  • 外层用单引号包裹kubectl命令,避免本地Shell解析内部转义
  • 对容器内需要保留的双引号,添加两层反斜杠(\\\"):第一层被远程Shell消耗,第二层被容器内Shell消耗,最终保留原始双引号

验证结果

执行修改后的脚本后,进入容器查看文件:

kubectl -n vault exec -it pod/vault-0 -- cat /tmp/policy.hcl

会得到期望的内容:

path "secret/*" { capabilities = ["create", "read", "update", "delete", "list"]}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 05:43:19