使用kubectl exec执行含特殊字符的Bash命令报错求助
解决kubectl exec远程执行bash命令时的特殊字符语法错误问题
问题根源
你遇到的语法错误核心是本地shell提前解析了命令里的特殊字符:
- 双引号包裹的
$(tar...)会在本地机器执行,而非传到Pod内运行 $?、*这些符号被本地shell做了变量替换或文件名扩展,导致传到Pod内的命令已被篡改,出现语法混乱
解决方案
方法1:用单引号包裹整个bash命令(推荐)
单引号会让本地shell完全不解析内部特殊字符,把命令原封不动传给Pod内的bash执行。内部双引号可直接保留,也可转义内部单引号:
kubectl -n myns exec mypod -- /bin/bash -c 'err=$(tar -cvzf /tmp/logs_aj.tgz ${all_files} 2>&1) || ( export ret=$?; [[ $err == *"No such file or directory"* ]] || exit "$ret" )'
若担心内部双引号冲突,也可将内部双引号替换为转义后的单引号:
kubectl -n myns exec mypod -- /bin/bash -c 'err=$(tar -cvzf /tmp/logs_aj.tgz ${all_files} 2>&1) || ( export ret=$?; [[ $err == *'\''No such file or directory'\''* ]] || exit "$ret" )'
方法2:转义所有特殊字符(适合必须用双引号的场景)
如果一定要用双引号包裹,需把所有会被本地shell解析的特殊字符转义:$加\变为\$,*加\变为\*,内部双引号加\变为\":
kubectl -n myns exec mypod -- /bin/bash -c "err=\$(tar -cvzf /tmp/logs_aj.tgz \${all_files} 2>&1) || ( export ret=\$?; [[ \$err == \*\"No such file or directory\"\* ]] || exit \"\$ret\" )"
为什么替换*为&2A没用?
你之前的操作方向错误——*的问题是被本地shell做了文件名扩展,并非字符编码问题,替换成&2A完全不符合bash语法,自然无法解决问题。
内容的提问来源于stack exchange,提问作者codec
相关产品推荐
相关产品推荐

