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

脚本执行kubectl exec命令失败,手动运行同命令正常

问题根源

你的脚本将$COMMAND作为单个完整参数传递给kubectl exec,导致kubectl尝试执行名为openssl version的命令(而非openssl命令加version参数),因此出现“可执行文件未找到”的错误。

解决方案

1. 将命令定义为数组

不要用字符串存储命令,改用数组拆分命令和参数:

  • 如果命令是脚本内部固定的:
    COMMAND=(openssl version)
    
  • 如果命令是通过脚本参数传入(比如执行./your-script.sh openssl version):
    # 把所有传入的命令参数存入数组
    COMMAND=("$@")
    

2. 修改kubectl执行语句

用数组展开语法"${COMMAND[@]}"传递命令,确保每个参数被正确拆分:

kubectl -n $NAMESPACE exec $pod -c $container -- "${COMMAND[@]}"

3. 同步修改echo输出(可选)

为了让echo显示的命令和实际执行的一致,修改echo行:

echo "COMMAND BEING RUN: \"kubectl -n $NAMESPACE exec $pod -c $container -- ${COMMAND[*]}\""
修改后的完整脚本片段示例
# 示例:内部定义命令数组
COMMAND=(openssl version)

for pod in $PODS; do
CONTAINERS=($(kubectl -n $NAMESPACE get pods $pod -o jsonpath='{.spec.containers[*].name}' | tr -s '[[:space:]]' '\n'))
header "{pod: \"$pod\", containers: \"$(echo $CONTAINERS | tr -d '\n')\"}"

if [ "$DRYRUN" != "true" ]; then
    for container in $CONTAINERS; do
        echo "COMMAND BEING RUN: \"kubectl -n $NAMESPACE exec $pod -c $container -- ${COMMAND[*]}\""
        kubectl -n $NAMESPACE exec $pod -c $container -- "${COMMAND[@]}"
    done
fi
done

为什么手动执行没问题?

手动输入命令时,Shell会自动将openssl和version拆分为两个独立参数传递给kubectl;而脚本中用字符串变量直接传递时,Shell会把整个字符串当作单个参数,导致kubectl误解要执行的命令。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 00:15:35