答案是vendor/bin下可执行文件属主为root导致exec失败,需用sudo chown -R $USER:$USER vendor/修复所有权,而非改权限位或重装;Windows下则多因防病毒软件拦截.bat生成。

脚本执行失败时的 Permission denied,90% 是 vendor/bin 下可执行文件属主为 root,不是权限位问题,更不是脚本内容写错。
为什么 post-install-cmd 或 post-update-cmd 会卡在 Permission denied
Composer 运行脚本(如 php artisan optimize、npm run dev)前,会先尝试执行 vendor/bin/xxx 中的可执行文件。如果该文件或其父目录 vendor/bin/ 属主是 root,普通用户 shell 就无法 exec 它——Linux 内核直接拒绝,报错常为 Permission denied,但不提示具体路径。
- 典型现象:运行
composer install成功,但最后一步Executing script php artisan optimize失败,错误行只有sh: 1: php: Permission denied或sh: 1: npm: Permission denied - 根本原因不是
php或npm命令不存在,而是vendor/bin/php(软链)或vendor/bin/npm(包装脚本)本身不可执行——因为它的属主是root,而当前用户无权exec其他用户拥有的可执行文件(即使权限位是755) - 检查方法:
ls -l vendor/bin/ | head -5,看输出中是否含root root;再单独查一个:ls -ld vendor/bin/php
如何确认 vendor/bin 下的脚本是否“真正可执行”
Linux 的“可执行”包含两个层面:权限位(x)和所有权(exec 权限受属主限制)。仅 chmod +x 不够,必须属主匹配。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 运行
stat vendor/bin/php,重点看Uid:和Gid:是否等于$(id -u)和$(id -g) - 用当前用户尝试直接运行:
./vendor/bin/php --version—— 如果报Permission denied,基本锁定属主问题 - 对比
which php输出的系统php:它属主是你,所以能跑;而vendor/bin/php是个软链,最终指向../composer/bin/composer或类似路径,那一整条链都要属主一致
修复 vendor/bin 权限的最小安全操作
别碰 chmod -R 777 vendor/,也别 sudo composer install 重装——这会让问题嵌套更深。
- 只修复
vendor/目录及其子项的所有权:sudo chown -R $USER:$USER vendor/(注意末尾斜杠,确保递归生效) - 验证修复:
ls -ld vendor/ vendor/bin/ vendor/bin/php,三者属主都应为当前用户 - 如果
composer.lock也是root,一并加入:sudo chown -R $USER:$USER vendor/ composer.lock - CI/CD 中建议加防护:在
composer install前插入chown -R $(whoami):$(whoami) .(前提是工作目录可写)
Windows 下 vendor/bin/*.bat 的特殊表现
Windows 报 Access is denied 却没路径?大概率是防病毒软件拦截了 .bat 文件生成,或当前 PowerShell/CMD 会话无权执行该位置的批处理文件。
- 临时禁用 Windows Defender 实时防护,重试
composer install - 改用 Git Bash 运行命令,它把
vendor/bin/xxx转为 shell wrapper,绕过 Windows 的.bat权限模型 - 若必须用 PowerShell,跳过脚本阶段:
composer install --no-scripts,后续手动执行逻辑 - 检查
%APPDATA%\Composer\vendor\bin\是否已加入PATH,且该目录下.bat文件右键 → 属性 → 安全 → 当前用户有“读取和执行”权限
最易被忽略的是:一次 sudo composer install 可能让 vendor/bin/ 下混入个别 root 所有子文件,ls -la vendor/bin/ 才能暴露它们——这种局部污染比整目录错配更难定位,也更难清理。

















