错误源于 .user.ini 被 chattr +i 设为不可变,需先 chattr -i 解锁再 rm;删后须清 php 进程、reload nginx,并补 open_basedir 防护,否则导致跨站或 404。

rm: cannot remove '.user.ini': Operation not permitted 是 chattr 的 i 属性在拦路
这个错误不是权限不够,也不是 root 不够 root,而是 Linux 文件系统级的“不可变”锁。.user.ini 默认被宝塔或 LNMP 脚本用 chattr +i 加了 i 属性 —— 一旦加上,连 root 都不能删、改、重命名,rm、mv、echo > .user.ini 全部失败。
必须先解除锁定才能操作:
- 进入站点根目录:
cd /www/wwwroot/your-site.com - 查看当前属性:
lsattr .user.ini(输出类似----i---------e--- .user.ini,有i就确认了) - 去掉不可变标志:
chattr -i .user.ini - 再删就成功:
rm -f .user.ini
删完还是报错?检查有没有其他进程正拿着这个文件
即使 .user.ini 已删,Nginx 或 PHP-FPM 进程可能还在内存里加载着旧配置,导致后续请求出错(比如 No input file specified. 或 404),甚至阻碍你重新写入或重启服务。
别只盯着文件,顺手清进程:
- 停止该站点:在宝塔面板点“停止”,或执行
bt 8→ 网站 → 停止对应站点 - 杀掉所有关联 PHP 进程:
pkill -f "www/wwwroot/your-site.com" - 检查是否还有句柄残留:
lsof +D /www/wwwroot/your-site.com 2>/dev/null(无输出才安全) - 最后 reload Nginx:
nginx -s reload或bt 3
用 FTP/SFTP 强删失败时,试试“Root 模式”绕过内核限制
某些低权限 SSH 环境下 chattr 不可用,或者你不敢碰命令行 —— 此时 FileZilla、WinSCP 等客户端的 SFTP “Root 登录”反而是更稳的暴力路径。
前提是你的服务器允许 root 密码/SFTP 登录(宝塔默认关闭 root 密码登录,需先在 SSH 设置里开启):
- FileZilla 中协议选
SFTP,主机填 IP,端口22,用户名root,密码或密钥登录 - 打开
/www/wwwroot/your-site.com,右键点.user.ini→ 删除 - 客户端底层会自动调用带权限提升的系统调用,比终端
rm更底层,常能绕过i属性拦截
删了.user.ini 后网站崩了?这不是删错了,是 open_basedir 失效了
.user.ini 不只是个“讨厌的锁”,它实际承载了 PHP 的 open_basedir 限制。你手动删掉它,等于把网站目录的“安全围栏”拆了 —— 接下来可能出现跨站读取、include 其他站点文件、甚至被利用写 shell。
真要删,必须补上等效防护:
- 进宝塔 → 网站 → 对应站点 → “PHP 设置” → 关闭“防跨站攻击”(这会自动删掉 .user.ini 并改 Nginx 配置加
fastcgi_param PHP_ADMIN_VALUE "open_basedir=...") - 或手动在站点配置里加:
fastcgi_param PHP_ADMIN_VALUE "open_basedir=/www/wwwroot/your-site.com:/tmp/:/proc/"; - 切勿删完就跑,也不要用空
open_basedir或设成/
最常被忽略的一点:删 .user.ini 后不重启 PHP-FPM,旧进程仍按老规则跑 —— 表现就是删了也像没删,错误照出。务必确认 PHP 进程已更新配置,而不是只 reload Nginx。










