没有不值得去解决的问题,也没有不值得去学习的技术!

WordPress 网站根目录清理实战:从误粘贴生成的 0 字节文件,到历史脚本、验证文件与旧安装包逐项排查

图 1:网站根目录中存在大量异常的 0 字节文件

作者:

,

最近在服务器上整理 WordPress 网站时,我发现网站根目录中存在一些非常奇怪的文件名,例如:

Plaintext
insert_id
post_tag,
ids
name
--max-time
-D
-o
tail
0
0,
false,
,

甚至还有一条明显来自日志过滤命令的正则表达式,被直接变成了文件名。

这些文件大多只有 0 字节。结合之前在 SSH 终端中执行和粘贴较长命令的经历,基本可以判断,其中一部分文件很可能是在某次命令粘贴或执行过程中意外创建的。

不过,WordPress 目录里本身也存在不少正常的 0 字节文件。如果看到空文件就全部删除,很容易误伤 WordPress 核心、插件缓存保护文件或历史工具。

因此,这次没有直接批量删除,而是按“先扫描、再确认、优先隔离、最后才删除”的方式,对整个网站目录进行了一次比较完整的清理。

网站目录为:

Plaintext
/data/wwwroot/www.shuijingwanwq.com

一、首先发现一批明显异常的 0 字节文件

最开始通过 ls -la 查看网站根目录时,可以看到不少完全不像正常 WordPress 文件的项目。

图 1:网站根目录中存在大量异常的 0 字节文件
图 1:网站根目录中存在大量异常的 0 字节文件

例如:

Plaintext
,
0
0,
ids
insert_id
name
post_tag,
--max-time
-D
-o

还有这样一个几乎可以确定来自 Shell 命令的文件名:

Plaintext
^\[13-Jul-2026 21:(20|21|22|23|24|25|26):.*(execution timed out|terminating|SIGTERM|too slow)

这些文件的共同特点非常明显:

  • 大量文件大小为 0;
  • 文件名像命令、参数、变量值或 SQL 字段;
  • 有些甚至以 - 开头;
  • 与 WordPress 正常目录结构完全无关。

第一次统计时,整个站点共有 63 个 0 字节普通文件

但这里不能简单执行:

Bash
find . -type f -size 0 -delete

因为后续检查证明,WordPress 核心、W3 Total Cache、WPCode、SyntaxHighlighter、Organize Series 等组件中,本身就存在正常的空文件。

所以我只挑出了其中 16 个高置信度异常文件,先移动到隔离目录,而不是直接删除。

隔离完成后:

Plaintext
moved=16
skipped=0
图 2:16 个明显属于命令碎片的文件全部成功移入隔离目录
图 2:16 个明显属于命令碎片的文件全部成功移入隔离目录

网站中的 0 字节文件数量也从:

Plaintext
63

下降到了:

Plaintext
47

二、为什么剩下的 0 字节文件不能继续批量删除

接下来逐项检查剩余空文件后,发现其中很多都有正常来源。

例如 WordPress 核心中就包括:

Plaintext
wp-includes/js/swfupload/license.txt
wp-includes/js/swfupload/swfupload.js
wp-includes/js/swfupload/handlers.js
wp-includes/js/swfupload/handlers.min.js
wp-includes/js/swfobject.js

这些文件虽然是 0 字节,但运行 WordPress 核心校验后:

Bash
wp --allow-root core verify-checksums

结果为:

Plaintext
Success: WordPress installation verifies against checksums.

说明它们就是当前 WordPress 官方发行包的一部分,不能因为大小是 0 就删除。

另外还有:

  • W3 Total Cache 的缓存目录保护 index.html
  • WPCode 等插件中的占位文件;
  • logreport/no_delete
  • logreport/show/no_delete
  • SyntaxHighlighter 自带的 clipboard.swf
  • Organize Series、Microsoft Clarity 等插件自己的文件。

因此,“0 字节”只能作为排查线索,不能作为删除依据。

三、又发现一个 2019 年遗留的 temp-write-test 文件

剩余文件中还有:

Plaintext
wp-content/temp-write-test-1565457605

继续追查源码后发现,WordPress 自己的:

Plaintext
wp-admin/includes/file.php

会创建类似:

Plaintext
temp-write-test-*

的临时文件,用于判断目录写入权限和文件所有权。

正常情况下,测试结束后文件应该被删除。

而这个文件的修改时间可以追溯到 2019 年。我后来又在自己 2021 年 2 月 19 日的一篇旧博客中找到了它:

也就是说,它至少在 2021 年就已经存在,并不是最近终端误操作产生的文件。

最终判断是:

这是一个历史 WordPress 写权限检测临时文件,由于某种原因当时没有正常清理。

因此同样没有直接删除,而是将其移入隔离目录。

处理以后,全站 0 字节文件数量进一步从:

Plaintext
47

下降到:

Plaintext
46

这个数字一直保留到了最终检查。

四、顺手清理已经不用的 Hueman 主题和 Hueman Addons

检查历史文件时,还发现服务器中仍然保留着已经不用的 Hueman:

Plaintext
hueman              inactive
hueman-addons       inactive

目前网站已经使用 Twenty Twenty-Five,因此 Hueman 主题先通过 WP-CLI 删除:

Bash
wp --allow-root theme delete hueman

删除成功。

但是删除 Hueman Addons 时却遇到了:

Plaintext
Error: Cannot do 'launch': The PHP functions proc_open() and/or proc_close() are disabled.

进一步检查发现,当前 PHP 8.5 的全局 disable_functions 中禁用了:

Plaintext
proc_open
proc_get_status

考虑到网站生产环境还在使用 PHP-FPM,我没有为了 WP-CLI 去修改全局 PHP 安全配置。

最后采用的办法是:

只在执行 WP-CLI 时临时放开 WP-CLI 所需要的几个 PHP 函数,PHP-FPM 和普通 PHP CLI 的全局安全限制保持不变。

通过这种方式,Hueman Addons 也成功删除:

Plaintext
Deleted 'hueman-addons' plugin.
Success: Deleted 1 of 1 plugins.

随后又在 root 用户的 .bashrc 中增加了一个 wp() Bash 函数,让以后执行 WP-CLI 时自动使用这套临时配置。

这样以后再清理插件或主题,就不需要每次重新输入一长串 PHP 参数,同时也不会为了 WP-CLI 降低整个 PHP-FPM 环境的限制。

五、继续检查:异常文件是否还有“非 0 字节版本”

把 0 字节异常文件处理完以后,我又想到一个问题:

如果以前的终端误粘贴不仅创建过空文件,还创建过有内容的异常文件怎么办?

因此又扫描了所有文件大小,重点寻找:

  • - 开头的文件;
  • 包含 Shell 元字符的文件名;
  • 根目录中的命令式文件名;
  • 文件名前后包含异常空白;
  • 换行符、Tab 等异常字符。

结果为:

Plaintext
suspicious_count=0

这意味着,前面隔离掉那 16 个文件以后,已经没有发现同类型的高置信度 Shell 命令碎片文件。

六、第二轮扫描一度产生几千行结果

后来我进一步扩大规则,检查:

  • 网站根目录非常规文件;
  • 文件名中的异常字符;
  • uploadscache 中的 PHP 等脚本。

结果输出一下变得非常大。

原因不是发现了几千个木马,而是:

Plaintext
wp-content/cache/object/

下面存在大量 W3 Total Cache 对象缓存文件,例如:

Plaintext
wp-content/cache/object/term_language_relationships/.../*.php

这类文件本身就是缓存数据。

因此重新调整扫描规则:

整个 wp-content/cache/ 不参与这一轮异常文件判断。

毕竟 W3 Total Cache 的缓存旧文件、垃圾回收以及 _old 文件问题,本来就准备以后单独审计,没有必要和这次网站根目录清理混在一起。

调整以后,只剩 23 个值得人工复核的项目

七、23 个非常规文件中,真正需要清理的并不多

这一轮扫描发现了一些非常有年代感的文件:

Plaintext
Adobe AIR_3.6.exe
nginx-1.10.1.zip
hosts
make_sql.php
wp-config.php.bak-slytranslate-debug-2026-07-14-100437

此外还有:

Plaintext
fix-en-chinese-tags.php
polylang-batch-zh-to-en-tags.php
merge-tags.php
nginx.conf
cdn-test.html
ads.txt

以及 Google、百度、搜狗、IndexNow 等验证文件。

这时候再次证明:

文件看起来奇怪,并不代表它应该删除。

所以后面没有批量处理,而是一个一个确认用途。

八、三个 PHP 文件原来是我每天还在使用的标签维护工具

下面三个文件最开始看起来很像一次性维护脚本:

Plaintext
fix-en-chinese-tags.php
polylang-batch-zh-to-en-tags.php
merge-tags.php

但实际上它们是我现在仍在使用的 WordPress / Polylang 标签处理工具。

继续查看入口代码后,三个文件开头都有:

PHP
if (php_sapi_name() !== 'cli') {
    die("❌ 请在命令行运行\n");
}

后面才加载:

PHP
require __DIR__ . '/wp-config.php';

其中部分脚本还支持:

Plaintext
--dry-run
--all

等命令行参数。

因此它们明确属于 PHP CLI 专用维护脚本

即使浏览器直接访问,也会在加载 WordPress 和执行数据库逻辑之前终止。

所以最终决定:

Plaintext
fix-en-chinese-tags.php
polylang-batch-zh-to-en-tags.php
merge-tags.php

全部保留。

这也是这次清理过程中非常重要的一点:不能仅凭文件名和位置判断一个文件已经废弃。

九、make_sql.php 通过旧博客找回了来历

对于:

Plaintext
make_sql.php

我直接在自己的博客中搜索文件名,找到了 2026 年 4 月 30 日的旧记录:

这个脚本当时用于根据 Nginx 历史访问日志生成浏览量导入 SQL,再将历史浏览量导入 WordPress。

当时它本来就是一次性数据处理流程。

现在相关任务已经完成,也不需要继续通过公网访问:

Plaintext
https://www.shuijingwanwq.com/make_sql.php

因此将其移出了网站根目录,但没有永久删除,而是保存在:

Plaintext
/root/swq-webroot-cleanup-quarantine-20260808/

以后如果还要参考当时的处理逻辑,仍然可以找回来。

十、wp-config.php 备份文件优先移出公网目录

本次发现的文件中,我认为最应该优先处理的是:

Plaintext
wp-config.php.bak-slytranslate-debug-2026-07-14-100437

它虽然只是调试期间留下的备份,但 wp-config.php 中可能包含:

  • 数据库连接信息;
  • WordPress 密钥;
  • 其他敏感配置。

而备份文件的扩展名已经不是正常的 .php

这类文件没有任何理由继续放在 Web 根目录。

所以第一时间将它移动到:

Plaintext
/root/swq-webroot-cleanup-quarantine-20260808/

而不是继续留在:

Plaintext
/data/wwwroot/www.shuijingwanwq.com/

十一、2013 年的 Adobe AIR 和 2016 年的 Nginx ZIP 也找了出来

另外两个非常典型的历史遗留文件:

Plaintext
Adobe AIR_3.6.exe
nginx-1.10.1.zip

修改时间分别可以追溯到:

Plaintext
2013
2016

nginx-1.10.1.zip 与我过去在 Windows 本地开发环境中使用的 Nginx 1.10.1 时间线也完全吻合。

这些文件显然不是当前 WordPress、Linux、PHP-FPM 或 Nginx 生产环境所需文件。

但考虑到它们毕竟是多年以前留下的资料,我依然采用隔离而不是立即永久删除。

十二、hosts 原来也是 2017 年本地开发留下来的

网站根目录还有一个:

Plaintext
hosts

只有 110 字节。

内容为:

Plaintext
127.0.0.1       localhost
::1             ip6-localhost

172.28.28.18    default.interact.shenzhen.localhost

结合过去的博客记录,可以确认这是以前 Windows / Android / Genymotion 本地开发过程中留下来的 hosts 文件,而不是现在服务器真正使用的:

Plaintext
/etc/hosts

因此它也被移入隔离目录。

十三、根目录中的 nginx.conf 反而不能删

比较容易误判的还有:

Plaintext
nginx.conf

它并不是当前实际运行的:

Plaintext
/usr/local/nginx/conf/nginx.conf

两者 SHA256 不同:

Plaintext
929e8a834bd2494c42f12a8f7cb12795409c6aa7e23e5576b7b9e63ec0d6390b  nginx.conf
6bd4e466bbcc629ee076386b54949a35ead6e22213faaa614191b878de751d7e  /usr/local/nginx/conf/nginx.conf

通过 nginx -T 检查,也没有发现当前 Nginx 配置显式引用网站根目录中的这个文件。

但查看内容以后马上发现:

Plaintext
# BEGIN W3TC Page Cache cache
...
# END W3TC Page Cache cache

# BEGIN W3TC Browser Cache
...
# END W3TC Browser Cache

# BEGIN W3TC Page Cache core

也就是说,这是 W3 Total Cache 生成的 Nginx 规则文件

所以虽然当前没有直接发现它被 Nginx 主配置加载,也不应该趁这次目录清理随便删除。

W3TC 后续会单独审计,本次先保留。

十四、验证文件也不能看到旧就直接删

根目录还存在不少验证文件,例如:

Plaintext
google6ef993c34e9a65a9.html
baidu_verify_U5mywj2jTv.html
baidu_verify_codeva-LyBgT68D0O.html
baidu_verify_codeva-0D6Gn3P4Mk.html
sogousiteverification.txt
1311aeca4e764c48afb3665fb02f3537.html
ed840343aa968ef81a2d8c6d432b7abc.txt

这些文件大多只有几十到一百多字节。

我还专门检查了当前 Nginx 日志中的访问次数,结果全部为 0。

但这不能直接说明它们已经无用。

原因很简单:

  1. 搜索引擎的网站验证可能多年都不会重新请求一次;
  2. 现在网站前面还有 CDN,请求也未必一定进入当前源站日志;
  3. 删除验证文件可能导致以后重新验证站点所有权时出现问题。

因此,目前仍在使用的 Google、百度搜索资源平台、搜狗以及 IndexNow 等相关文件继续保留。

十五、百度联盟、阿里妈妈和 360 WebScan 已停用,因此对应验证文件直接删除

不过有三个文件已经可以明确确认没有继续保留的意义。

百度联盟

Plaintext
bdunion.txt

现在已经明确不再使用百度联盟,因此直接删除。

阿里妈妈 / 淘宝联盟

Plaintext
root.txt

对应的平台也已经不再使用,因此同样删除。

360 网站安全检测

Plaintext
webscan_360_cn.html

这是以前 360 网站安全检测 / WebScan 使用的网站验证文件。

目前已经明确不再使用这项服务,因此也直接删除。

最终确认:

Plaintext
CLEAN: bdunion.txt
CLEAN: root.txt
CLEAN: webscan_360_cn.html

十六、ads.txt 只有 Google AdSense,继续保留

根目录还有:

Plaintext
ads.txt

检查内容:

Plaintext
google.com, pub-8392190980622725, DIRECT, f08c47fec0942fa0

当前只有 Google AdSense 授权记录,没有 Adsterra 或其他已经停用广告平台的记录。

因此 ads.txt 继续保留。

十七、最终清理结果

最后再次检查已经处理过的文件:

Plaintext
CLEAN: bdunion.txt
CLEAN: root.txt
CLEAN: webscan_360_cn.html
CLEAN: hosts
CLEAN: make_sql.php
CLEAN: Adobe AIR_3.6.exe
CLEAN: nginx-1.10.1.zip
CLEAN: wp-config.php.bak-slytranslate-debug-2026-07-14-100437
图 3:最终确认已清理文件全部离开 Web 根目录,同时保留 5 个历史文件到隔离目录
图 3:最终确认已清理文件全部离开 Web 根目录,同时保留 5 个历史文件到隔离目录

当前隔离目录:

Plaintext
/root/swq-webroot-cleanup-quarantine-20260808

里面保留:

Plaintext
Adobe AIR_3.6.exe
hosts
make_sql.php
nginx-1.10.1.zip
wp-config.php.bak-slytranslate-debug-2026-07-14-100437

总大小大约:

Plaintext
2.0 MB

另外,最开始发现的 16 个 Shell 命令碎片文件,则保存在:

Plaintext
/root/swq-zero-byte-quarantine-20260808

两个隔离目录暂时都不会马上删除,先保留一段时间。

十八、清理完成后的最终基线

最后统计:

Plaintext
网站根目录普通文件:32
全站 0 字节文件:46

最重要的是:

Plaintext
高置信度命令碎片异常文件:0

同时 WordPress Core checksum 已经通过。

因此,目前剩余的 46 个 0 字节文件不能再理解成“46 个垃圾文件”。

它们中的绝大部分已经确认属于:

  • WordPress 官方核心文件;
  • 插件自带空文件;
  • W3 Total Cache / WPCode 的目录保护文件;
  • 历史日志目录标记文件;
  • 其他具有明确用途的占位文件。

继续为了把数字降到 0 而清理,反而可能开始误删正常文件。

十九、这次清理最大的体会

这次排查最开始只是想处理几个因为 Shell 命令误粘贴而产生的空文件,最后却顺着这条线发现了:

  • 16 个明显的命令碎片文件;
  • 一个多年遗留的 WordPress temp-write-test
  • 已经不用的 Hueman 主题;
  • 已经不用的 Hueman Addons;
  • 一个暴露在 Web 根目录的 wp-config.php 调试备份;
  • 一个完成历史使命的 make_sql.php
  • 2013 年的 Adobe AIR 安装程序;
  • 2016 年的 Nginx Windows 压缩包;
  • 2017 年的本地开发 hosts
  • 已经停用的百度联盟、阿里妈妈和 360 WebScan 验证文件。

但同时也避免误删了:

  • 仍在日常使用的三个标签维护脚本;
  • W3 Total Cache 生成的 nginx.conf
  • W3TC 预加载 Sitemap;
  • Google AdSense 的 ads.txt
  • 搜索引擎与 IndexNow 验证文件;
  • WordPress 和插件自带的正常 0 字节文件。

所以对于一个已经运行十多年、经历过多次迁移、主题更换、插件调整以及服务器环境变化的 WordPress 网站来说,目录清理真正困难的并不是:

“怎么批量删除文件?”

而是:

怎么证明一个文件确实已经没有用了。

我的做法最终变成了:

发现异常 → 查看文件属性 → 查源码 → 查旧博客 → 查当前配置 → 判断是否仍在使用 → 优先隔离 → 最后才删除。

虽然比直接执行一条 find ... -delete 麻烦很多,但对于生产站点来说,这种方式明显更稳妥。

这次清理到这里可以暂时结束。

接下来如果还要继续整理,我会把 W3 Total Cache 的历史页面缓存、_old 文件和垃圾回收机制 单独作为一个问题处理,而不会再和网站根目录清理混在一起。

Linux 服务器运维、部署与线上故障排查

如果你的网站或后端服务部署在 Linux 服务器上,遇到访问异常、Nginx 配置问题、MySQL / Redis 异常、Docker 服务不可用、磁盘占满、CPU / 内存过高等问题,可以联系我做一次远程排查。

适合以下场景:
✅ 网站打不开或访问不稳定
✅ Nginx / PHP-FPM 配置异常
✅ MySQL / Redis 性能或连接问题
✅ Docker 服务部署与维护
✅ 服务器迁移与环境配置
✅ CPU / 内存 / 磁盘异常排查

服务内容:
✅ Linux 环境检查
✅ 网站部署与迁移
✅ Nginx / PHP-FPM / MySQL / Redis 排查
✅ Docker 配置与维护
✅ 服务器性能分析
✅ 长期远程运维支持

如需咨询,请联系我,并注明:Linux 运维咨询

联系方式:
Telegram:@shuijingwan
微信:13980074657
邮箱:shuijingwanwq@gmail.com

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理