Node.js中用exec调用Bash脚本遇权限问题,如何赋予完整权限?
Node.js exec调用Bash脚本的权限与文件列表异常问题
问题现象
直接在Bash环境运行脚本时,能正常遍历./src下所有包含process.env的文件;但通过Node.js的exec调用时:
- 仅输出单个文件结果
- 抛出权限拒绝错误:
./scripts/check_envvars.bash: line 48: ./src/routers/healthcheck/validation.ts: Permission denied - 脚本中
test_list能返回完整文件列表,但envvar_files_list的生成步骤出现异常 - 尝试过
chmod -R u+x ./src修改权限,问题依然存在
核心原因
- 权限操作错误:给
.ts源码文件加执行权限(u+x)完全没必要,这类文件只需要读权限,错误的权限操作反而可能引发异常。 - 参数传递与接收不匹配:Node.js调用时传入了
"./db ./src"作为参数,但Bash脚本里硬编码了FOLDERS_TO_SEARCH=./src,根本没用到传入的参数;同时用$(echo $FOLDERS_TO_SEARCH)处理路径时,多文件夹场景下会被错误拆分。 - 数组构建逻辑缺陷:用
$(grep ... | tr '\n' ' ')将文件名转为空格分隔字符串再转数组,一旦文件名含空格就会出错;且envvar_files_arr=(echo $envvar_files_list)属于冗余且不安全的写法,容易触发路径名意外拆分。 - grep命令冗余:
grep -r -l直接传入文件夹路径即可,不需要额外的echo处理。
修复步骤
- 修正权限设置:确保
./src下文件有读权限,执行chmod -R u+r ./src(不要加执行权限) - 适配参数传递:Bash脚本改用传入的参数作为搜索目录,替代硬编码的路径
- 安全构建文件数组:用
mapfile或readarray直接读取grep结果到数组,避免字符串拆分的坑 - 简化grep命令:去掉多余的
echo和tr操作,直接用grep -r -l "process.env" "$@"获取目标文件
修改后的代码示例
Bash脚本(check_envvars.bash)
# 使用传入的参数作为搜索目录,无参数时默认./src FOLDERS_TO_SEARCH="${@:-./src}" # 用mapfile直接读取grep结果到数组,避免字符串拆分问题 mapfile -t envvar_files_arr < <(grep -r -l "process.env" $FOLDERS_TO_SEARCH) echo "找到的文件列表:" printf '%s\n' "${envvar_files_arr[@]}" for filePath in "${envvar_files_arr[@]}" do # 先检查文件是否可读,再处理 if [[ -r "$filePath" ]]; then found_destructured=($(cat "$filePath" | tr '\n' ' ' | sed 's/ */ /g' | grep -Ezo '{[^}]*} = process.env' | sed 's/.*{\([^}]*\)}.*/\1/g' | tr -d ' ' | tr ',' '\n' | tr -d "=''" | awk -F':' '{print $1}')) # 此处可添加对found_destructured的后续处理逻辑 else echo "警告:文件$filePath不可读,跳过" >&2 fi done
Node.js调用代码
import { exec } from 'child_process'; exec( 'bash ./scripts/check_envvars.bash ./db ./src healthcheck', (error, stdout, stderr) => { console.log(`stdout: ${stdout}`); console.error(`stderr: ${stderr}`); if (error) { console.error(`exec error: ${error}`); return; } } );
权限修正命令(按需执行)
如果确实存在文件读权限不足的情况,执行:
chmod -R u+r ./src
内容的提问来源于stack exchange,提问作者James111
相关产品推荐
相关产品推荐

