Skip to content

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'
}

环境信息 ​

  • 系统:macOS 15.0 / Ubuntu 22.04 LTS
  • Shell:zsh / bash
  • 运行时:Node.js v20.x
  • 文件系统:APFS / ext4

排查过程 ​

  1. 查看脚本文件权限位: 使用 ls -l 查看该文件的 UNIX 文件权限属性:

    bash
    ls -la scripts/deploy.sh

    输出显示:

    text
    -rw-r--r--@ 1 mac staff 1420 Oct 02 10:15 scripts/deploy.sh

    权限为 644,没有任何可执行权限位(缺少 x 权限)。

  2. 为什么由 AI 新建的文件默认无执行权限: AI 代码生成工具通常通过标准文件写入 API(例如 Node.js fs.writeFile 或编辑器插件接口)生成文件,默认采用 0o666 & ~umask(一般为 644),不会主动附加 chmod +x 权限。

  3. 测试 Git 索引中的权限模式: 在团队协作中,Git 会记录文件的 executable 属性(100755 vs 100644)。如果仅在本地执行 chmod 但未提交 Git 权限模式,拉取代码的另一端仍会复现该问题。

原因 ​

  1. 本地文件系统权限缺失:新生成的 .sh 或脚本二进制文件没有赋予用户可执行权限 +x。
  2. 直接作为可执行程序执行而非作为解释器参数执行:直接运行 ./scripts/deploy.sh 要求内核具备执行位;而如果使用 bash ./scripts/deploy.sh,则只需要文件的读取权限(r),不需要执行权限。

解决步骤 ​

方案一:为脚本文件增加执行权限(推荐) ​

bash
chmod +x scripts/deploy.sh

如果该脚本已受 Git 版本控制,需要确保 Git 追踪该文件的执行位变更:

bash
git add --chmod=+x scripts/deploy.sh
git commit -m "chore: make deploy.sh executable"

方案二:显式调用解释器执行 ​

如果出于环境沙箱或只读挂载限制无法更改文件权限,在 AI 执行命令时改为显式指定解释器:

bash
# 执行 Bash 脚本
bash scripts/deploy.sh

# 执行 Node 脚本
node scripts/generate-assets.js

方案三:AI 生成提示词(Prompt / Rule)优化 ​

在项目根目录的规则文件中(如 .cursorrules 或项目指南中),加入一条指令约定:

“创建任何 shell 脚本后,自动执行 chmod +x <path> 或在调用时显式使用 bash <path>。”

验证结果 ​

  1. 赋予执行权限后重新检查权限位:
    bash
    ls -l scripts/deploy.sh
    # 输出:-rwxr-xr-x  1 mac staff 1420 Oct 02 10:20 scripts/deploy.sh
  2. 再次执行 ./scripts/deploy.sh,脚本成功运行并完成构建任务。
  3. 在 CI/CD 机器上拉取代码,验证 git ls-files -s scripts/deploy.sh 显示 100755,流水线无需额外 chmod 即可顺利运行。

经验总结 ​

  • AI 自动化创建文件时,默认只具备读写权限。执行脚本前需检查或由 AI 主动附加执行权限。
  • 在跨平台协作与 CI 环境下,善用 git add --chmod=+x 确保文件属性被版本库完整记录。
  • 对于临时的 Node 自动化脚本,优先显式通过 node path/to/script.js 启动,避免对文件系统权限位的隐式依赖。

参考资料 ​

基于 VitePress 构建 | 记录真实开发与 AI 协作过程