根本原因不是composer主动设错权限,而是zip/git不保留unix权限,导致vendor/bin脚本缺x位(644而非755)、storage目录无写权限;需用chmod +x vendor/bin/*修复脚本,对storage等目录精准设775/644,禁用chmod -r 777。

composer install 生成的文件权限为什么不对
根本原因不是 Composer 主动设错了权限,而是它默认不干预文件权限 —— 下载来源(ZIP/Git)本身就不带 Unix 权限信息,导致 vendor/ 下的 PHP 文件是 644、bin/ 脚本也是 644(而非应有的 755),storage/ 等目录也常是 755 而非可写所需的 775。
常见现象包括:vendor/bin/phpunit: Permission denied、file_put_contents(...): Permission denied(写缓存或日志时)、Laravel 的 storage/logs 写入失败。
- ZIP 包不保留
x位,Git 仓库若没显式git update-index --chmod=+x bin/phpunit,检出后就是不可执行 -
composer install用 root 运行过一次,整个vendor/就变成root:root,普通用户后续无法修改 - 系统
umask是0002或更宽松,导致新文件默认组可写(664),生产环境不安全
Linux/macOS 下修复 vendor/bin 脚本权限
这是最常踩坑的点:脚本存在,但直接运行报 Permission denied,本质是缺 x 位。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 临时修复:运行
chmod +x vendor/bin/*(仅当前项目有效) - 自动化方案:在
composer.json的scripts中加"post-install-cmd": ["chmod +x vendor/bin/*"]—— 注意该命令在 Windows 上会被跳过,不影响跨平台 - 根治方式:要求包作者在 Git 中对
bin/下脚本设好+x,你只需确认上游 repo 里git ls-files -s bin/phpunit输出中权限位是100755
storage、bootstrap/cache 等可写目录怎么设权
这类目录权限不能靠 chmod -R 775 一刀切,否则日志文件也被设成 664(应为 644),且递归操作易覆盖已有安全设置。
- 先确保目录存在且属主正确:
php -r "is_dir('storage') || mkdir('storage', 0775, true);" - 只对目录设 775(保证组可写),对其中的文件设 644:
find storage -type f -exec chmod 644 {} \;,再find storage -type d -exec chmod 775 {} \; - CI/CD 中推荐用 PHP 脚本而非 shell 命令,避免平台差异 —— 比如 Laravel 的
php artisan storage:link会自动处理 symlink 权限,比手动chmod更可靠
为什么绝对不要 chmod -R 777 vendor/
这不是“太宽松”,而是直接打开攻击面:一旦应用存在任意代码执行漏洞,攻击者能直接改写 vendor/autoload.php 或注入恶意类到 vendor/composer/autoload_classmap.php。
-
vendor/下所有 PHP 文件应为644(只读),bin/脚本应为755(可执行但不可写) - 真正需要可写的只有
vendor/composer/installed.json(更新依赖时写入),其他文件都不该被运行时进程修改 - Web 服务器用户(如
www-data)应通过组权限访问,而不是放宽到 world-writable —— 正确做法是usermod -a -G deploy www-data,再chmod -R g+rX vendor/
权限问题从来不是“跑起来就行”,而是每次 composer install 后都要验证 vendor/bin/ 是否可执行、storage/ 是否可写、vendor/ 下有没有意外的 666 或 777 文件 —— 这些细节在 CI 和生产环境里最容易被忽略。










