很多 WordPress 站点开放了用户注册功能后,后台会慢慢积攒一批机器人注册的垃圾账号。它们通常使用批量邮箱域名注册,账号本身没有真实内容,却会占用数据库、影响后台列表,甚至可能被用来试探登录。
如果手动一个个删除,既费时又容易漏掉。下面这条命令的思路很简单:先按邮箱域名统计注册数量,找出注册量异常高的非常用域名,再自动批量删除这些域名下的所有账号。整个流程可以一条命令跑完,特别适合定期维护使用。
完整命令
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# 1. 查找注册量>=5的异常域名(已过滤你提供的常用白名单) BAD_DOMAINS=$(sudo -u www wp db query " SELECT SUBSTRING_INDEX(user_email, '@', -1) FROM wp_users WHERE SUBSTRING_INDEX(user_email, '@', -1) NOT IN ( 'qq.com', '163.com', '126.com', 'gmail.com', 'outlook.com', 'hotmail.com', 'foxmail.com', 'yahoo.com', 'icloud.com', 'sina.com', 'aol.com', '139.com', 'sohu.com', 'sina.cn', 'yeah.net', 'live.com', 'yandex.com', '21cn.com', 'tom.com', 'aliyun.com', 'msn.com', 'vip.qq.com', '189.cn', 'mac.com', 'me.com', 'dingtalk.com' ) GROUP BY SUBSTRING_INDEX(user_email, '@', -1) HAVING COUNT(ID) >= 5; " --skip-column-names) # 2. 判断并自动循环删除 if [ -z "$BAD_DOMAINS" ]; then echo "恭喜!没有发现注册量>=5的非常用域名机器用户。" else echo "开始执行清理..." for domain in $BAD_DOMAINS; do echo "正在清理异常机器域名: $domain" # 找出该域名下的所有用户ID并静默删除(--yes) sudo -u www wp user list --search="*@$domain" --field=ID | xargs -r sudo -u www wp user delete --yes done echo "所有机器注册账号已全部清理完毕!" fi |
脚本拆解
第一步:找出可疑域名
wp db query 可以直接执行 SQL。这里用 SUBSTRING_INDEX(user_email, '@', -1) 从邮箱地址中截取出 @ 后面的域名,例如从 bot001@example.com 中取出 example.com。
随后通过 NOT IN (...) 排除掉一批常见邮箱域名,避免误删正常用户。白名单里已经包含了 QQ、网易、Gmail、Outlook、iCloud、新浪等主流邮箱。
最后按域名分组,用 HAVING COUNT(ID) >= 5 筛选出注册数量达到 5 个及以上的域名。正常个人邮箱很难同一域名注册 5 个以上,这个条件可以有效圈出批量注册的机器域名。
--skip-column-names 的作用是让查询结果只输出域名本身,方便后续循环读取。
第二步:自动批量删除
BAD_DOMAINS 为空时,说明没有发现异常域名,直接提示“恭喜”,不做任何删除。
如果找到了异常域名,就进入 for domain in $BAD_DOMAINS 循环,逐个处理。对每个域名:
wp user list --search="*@$domain" --field=ID列出该域名下所有用户 ID;xargs -r把这些 ID 传给wp user delete --yes,静默批量删除。
这样一次运行就能清掉多个异常域名下的全部机器账号。
使用前提
- 服务器上已经安装并配置好 WP-CLI。
sudo -u www中的www是网站运行用户,需要根据你的环境改成www-data或其他实际用户;如果当前执行用户已有权限,也可以去掉这部分。- 命令默认处理
wp_users表,适用于标准 WordPress 数据库前缀wp_。如果你的前缀不同,需要同步修改表名。
使用建议
先备份数据库。 删除用户是不可逆操作,建议运行前先备份,或者在测试站上验证一遍。
按需调整阈值。 示例中设置的是 >= 5,如果你的站点规模较小,可以改成 >= 3;规模较大时也可以适当调高,减少误判。
按需扩充白名单。 如果你的用户群体还有公司邮箱、学校邮箱等特殊域名,建议把相关域名加进 NOT IN (...),防止误删真实注册用户。
定期执行。 可以把这个脚本放进定时任务,每隔一段时间自动巡检一次。执行时若输出“恭喜”,就说明当前没有新的机器注册堆积。
总结
这条命令把“查找异常域名”和“批量删除用户”串在一起,适合做 WordPress 用户表的日常清理。核心逻辑就是:统计域名注册量、排除白名单、设置阈值、自动删除。只要备份到位、白名单维护好,就能比较安全地让后台用户列表重新变得清爽。
附录:宝塔面板安装 WP-CLI
如果你使用的是宝塔面板,可以先按下面步骤安装 WP-CLI,再回到前文执行清理命令。
1. 打开宝塔终端
登录宝塔面板,在左侧菜单找到「终端」,打开服务器终端;也可以通过 SSH 连接服务器后操作。
2. 确认站点使用的 PHP 版本
宝塔的 PHP 通常放在 /www/server/php/ 目录下,先看有哪些版本:
|
1 |
ls /www/server/php/ |
例如输出里有 80,就代表 PHP 8.0,对应的执行文件是 /www/server/php/80/bin/php。下面示例都以 80 为例,请按自己实际版本替换。
3. 下载 WP-CLI
|
1 2 |
cd /tmp curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar |
4. 用宝塔 PHP 验证下载文件
|
1 |
/www/server/php/80/bin/php /tmp/wp-cli.phar --info |
能正常输出 WP-CLI 信息,说明下载成功。
5. 安装为全局命令
先把文件放到系统目录,再创建一个使用宝塔 PHP 执行的 wp 命令:
|
1 2 3 4 5 6 |
sudo mv /tmp/wp-cli.phar /usr/local/bin/wp-cli.phar sudo bash -c 'cat > /usr/local/bin/wp <<EOF #!/bin/bash /www/server/php/80/bin/php /usr/local/bin/wp-cli.phar "$@" EOF' sudo chmod +x /usr/local/bin/wp |
6. 验证安装
|
1 |
wp --info |
看到版本和路径信息后,就可以回到文章前面的脚本,在 WordPress 网站目录下运行清理命令了。
