脚本执行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
相关产品推荐
相关产品推荐

