通过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
相关产品推荐
相关产品推荐

