防篡改插件默认拦截所有PHP写入操作,因其通过内核级监控+进程白名单机制限制非授权写入;需同时添加精确目录路径与对应php-fpm进程至例外才生效,否则仍报Permission denied等错误。

防篡改插件默认拦截所有 PHP 写入操作,包括 CMS 自动更新、插件安装、缓存生成等——不是插件坏了,是它太尽责了。
为什么网站更新失败时会报错 Permission denied 或 failed to open stream: No such file or directory
宝塔的防篡改(FileShield)本质是通过内核级文件监控 + 进程白名单机制拦截非授权写入。启用后,php-fpm 进程默认不在白名单中,所有由 PHP 脚本触发的 fopen、file_put_contents、rename 等操作都会被拒绝。WordPress 后台点“升级”、Typecho 安装插件、甚至 Laravel 的 storage:link 命令都卡在这一步。
- 错误日志通常出现在
/www/wwwlogs/your-site.error.log,关键线索是Operation not permitted或inotify_add_watch() failed - 不是权限 755/777 的问题——即使目录属主是
www,防篡改仍会拦截 - 临时关闭面板开关(在「安全」→「防篡改」里点「停止」)能立刻恢复更新,但失去防护
如何正确添加指定目录为例外,而非全局关闭
例外设置必须同时满足两个条件才生效:目录路径精确匹配 + 对应进程加入白名单。只加路径不加进程,或路径末尾多一个 /,都会失效。
- 在宝塔后台「安全」→「防篡改」→「添加例外」,填写绝对路径,例如:
/www/wwwroot/your-site/wp-content(不要写成/www/wwwroot/your-site/wp-content/) - 点击「添加」后,必须手动勾选对应站点的
php-fpm进程(如php-fpm: pool www),否则 PHP 仍无法写入 - 常见需放行的目录:
/wp-content(WordPress)、/public/uploads(ThinkPHP)、/storage和/bootstrap/cache(Laravel) - 不建议放行整个
/www/wwwroot/your-site——这等于关掉防护
更新完成后要不要重新开启防篡改
要,但得确认例外规则已持久化。宝塔 8.x 后版本重启面板服务(bt restart)不会清空例外列表,但升级面板或重装系统会丢失。
- 更新完立即进「防篡改」页面,检查例外目录和关联进程是否仍处于勾选状态
- 如果用的是宝塔免费版,注意其「防篡改」功能依赖
bt_crack模块,某些低配机器可能因内存不足导致规则加载失败(现象:开关显示开启,但实际无拦截效果) - 可执行
cat /www/server/panel/vhost/fileshield/exception.list手动核对配置文件内容是否与界面一致
真正容易被忽略的是进程白名单绑定——很多人只加了路径,忘了勾选 php-fpm 进程,结果反复测试都失败。另外,部分 CMS 更新会临时创建 .maintenance 文件在网站根目录,这个路径也得单独加例外,否则更新中途就卡住。










