Codex 运行脚本权限 EACCES 报错与权限沙箱治理
问题背景
在使用 AI 辅助生成并执行自动化脚本(例如 ./scripts/deploy.sh 或 node ./scripts/generate-assets.js)时,AI 助手在执行终端命令环节抛出 spawn EACCES 以及 bash: ./scripts/deploy.sh: Permission denied 错误,导致自动化流程中断。
问题现象
终端与助手交互日志中出现如下报错:
bash
$ ./scripts/deploy.sh
zsh: permission denied: ./scripts/deploy.sh
# 或者通过 Node.js child_process 调用时:
Error: spawn ./scripts/deploy.sh EACCES
at Process.ChildProcess._handle.onexit (node:internal/child_process:286:19)
at onErrorNT (node:internal/child_process:484:16)
at process.processTicksAndRejections (node:internal/process/task_queues:82:21) {
errno: -13,
code: 'EACCES',
syscall: 'spawn ./scripts/deploy.sh'
}1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
环境信息
- 系统:macOS 15.0 / Ubuntu 22.04 LTS
- Shell:zsh / bash
- 运行时:Node.js v20.x
- 文件系统:APFS / ext4
排查过程
查看脚本文件权限位: 使用
ls -l查看该文件的 UNIX 文件权限属性:bashls -la scripts/deploy.sh1输出显示:
text-rw-r--r--@ 1 mac staff 1420 Oct 02 10:15 scripts/deploy.sh1权限为
644,没有任何可执行权限位(缺少x权限)。为什么由 AI 新建的文件默认无执行权限: AI 代码生成工具通常通过标准文件写入 API(例如 Node.js
fs.writeFile或编辑器插件接口)生成文件,默认采用0o666 & ~umask(一般为644),不会主动附加chmod +x权限。测试 Git 索引中的权限模式: 在团队协作中,Git 会记录文件的 executable 属性(
100755vs100644)。如果仅在本地执行chmod但未提交 Git 权限模式,拉取代码的另一端仍会复现该问题。
原因
- 本地文件系统权限缺失:新生成的
.sh或脚本二进制文件没有赋予用户可执行权限+x。 - 直接作为可执行程序执行而非作为解释器参数执行:直接运行
./scripts/deploy.sh要求内核具备执行位;而如果使用bash ./scripts/deploy.sh,则只需要文件的读取权限(r),不需要执行权限。
解决步骤
方案一:为脚本文件增加执行权限(推荐)
bash
chmod +x scripts/deploy.sh1
如果该脚本已受 Git 版本控制,需要确保 Git 追踪该文件的执行位变更:
bash
git add --chmod=+x scripts/deploy.sh
git commit -m "chore: make deploy.sh executable"1
2
2
方案二:显式调用解释器执行
如果出于环境沙箱或只读挂载限制无法更改文件权限,在 AI 执行命令时改为显式指定解释器:
bash
# 执行 Bash 脚本
bash scripts/deploy.sh
# 执行 Node 脚本
node scripts/generate-assets.js1
2
3
4
5
2
3
4
5
方案三:AI 生成提示词(Prompt / Rule)优化
在项目根目录的规则文件中(如 .cursorrules 或项目指南中),加入一条指令约定:
“创建任何 shell 脚本后,自动执行
chmod +x <path>或在调用时显式使用bash <path>。”
验证结果
- 赋予执行权限后重新检查权限位:bash
ls -l scripts/deploy.sh # 输出:-rwxr-xr-x 1 mac staff 1420 Oct 02 10:20 scripts/deploy.sh1
2 - 再次执行
./scripts/deploy.sh,脚本成功运行并完成构建任务。 - 在 CI/CD 机器上拉取代码,验证
git ls-files -s scripts/deploy.sh显示100755,流水线无需额外chmod即可顺利运行。
经验总结
- AI 自动化创建文件时,默认只具备读写权限。执行脚本前需检查或由 AI 主动附加执行权限。
- 在跨平台协作与 CI 环境下,善用
git add --chmod=+x确保文件属性被版本库完整记录。 - 对于临时的 Node 自动化脚本,优先显式通过
node path/to/script.js启动,避免对文件系统权限位的隐式依赖。