CPU占用100%恶意进程一键定位查杀脚本

服务器CPU突然飙到100%,负载居高不下,top一看全是陌生进程占满CPU。
这种情况大概率是中了挖矿木马或恶意脚本。
手动排查费时又容易漏,今天我直接给你一个能一键定位、查杀并清理残留的Shell脚本,照着跑一遍就能恢复系统清净。

前置准备

  • 环境要求:CentOS 7/8、Ubuntu 18.04+、Debian 10+ 均可,需要root权限或sudo。
  • 操作工具:通过SSH连接到服务器(Windows用PuTTY,Mac/Linux直接终端)。
  • 备份提醒:虽然脚本只会操作用户态进程,但最好提前备份重要数据,以防误杀后需恢复。

一键定位查杀脚本实战

下面脚本会做三件事:

  1. 找出CPU占用率最高的前10个进程,筛选出可疑进程(非系统关键进程、名称异常、网络连接异常)。
  2. 自动杀死这些进程,并删除对应的二进制文件。
  3. 清理常见的恶意自启动项(cron任务、systemd服务)。

在服务器上创建文件:

vim /opt/kill_malicious.sh

粘贴以下内容(按实际需求可调整白名单):

#!/bin/bash
# 一键定位查杀CPU占用100%恶意进程
# 使用前建议检查白名单中的系统进程(sshd、nginx、mysql等)

WHITELIST="sshd|nginx|mysql|php-fpm|java|python3|systemd"

# 获取CPU占用最高的前10个进程
HIGH_CPU=$(ps aux --sort=-%cpu | head -11 | tail -10 | awk '{print $2,$11}')

echo "=== 当前CPU占用前10的进程 ==="
ps aux --sort=-%cpu | head -11

echo ""
echo "开始排查可疑进程..."

while IFS= read -r line; do
    PID=$(echo $line | awk '{print $1}')
    CMD=$(echo $line | awk '{print $2}')
    PROC_NAME=$(basename "$CMD" 2>/dev/null)

    # 跳过白名单进程
    if echo $PROC_NAME | grep -qiE "$WHITELIST"; then
        continue
    fi

    # 检查是否有外连(非本地连接)
    CONN=$(lsof -i -n -P 2>/dev/null | grep "$PID" | grep -v "127.0.0.1" | head -1)
    if [ -z "$CONN" ]; then
        continue
    fi

    echo "发现可疑进程:PID=$PID, 名称=$PROC_NAME, 外连信息=$CONN"
    
    # 杀掉进程
    kill -9 $PID 2>/dev/null
    # 删除二进制文件
    if [ -f "$CMD" ]; then
        rm -f "$CMD"
        echo "已删除文件:$CMD"
    fi
done <<< "$HIGH_CPU"

# 清理常见恶意自启动
systemctl list-units --type=service --state=running 2>/dev/null | grep -iE "[0-9a-f]{8}\b" | awk '{print $1}' | xargs -I {} systemctl stop {} 2>/dev/null
crontab -l 2>/dev/null | grep -iE "(wget|curl|bash|sh)" | while read cron; do
    crontab -l 2>/dev/null | grep -v "$cron" | crontab -
    echo "已清除可疑定时任务:$cron"
done

echo "=== 清理完成,当前CPU占用情况 ==="
ps aux --sort=-%cpu | head -10

保存后赋予执行权限并运行:

chmod +x /opt/kill_malicious.sh
bash /opt/kill_malicious.sh

避坑指南:这些情况必须注意

  1. 误杀系统进程:脚本白名单只覆盖常见服务,如果你服务器跑着自定义的服务进程,需要在脚本开头手动加入白名单(例如 WHITELIST="你的进程名")。
  2. 恶意进程伪装成系统名:有些木马会改名为[kworker][kswapd0]等内核线程名。脚本目前只通过外连检测判断,如果遇到纯本地潜伏的木马,可以结合ls -la /proc/$PID/exe查看实际二进制路径。
  3. 清理自启动重复出现:杀掉一次后又死灰复燃?说明有守护进程或定时任务没清干净。脚本已清理cron和systemd服务,但如果对方写入了/etc/rc.local~/.bashrc,需要手动检查这些文件。

效果验证:怎么确认问题已解决

  1. 运行tophtop,查看CPU空闲率是否恢复正常。
  2. 运行netstat -antp | grep ESTABLISHED,检查是否还有非本地的异常外连。
  3. 运行ps aux --sort=-%cpu | head -5,确保无陌生进程持续占CPU。
  4. 观察几分钟,若CPU再次飙升,说明还有残留,重新执行脚本并检查之前漏掉的启动项。

FAQ:常见问题快速解答

Q:脚本安全吗?会不会把我的网站搞崩?
A:脚本只停止并删除在脚本执行时CPU占用极高且有外连的进程(白名单已过滤sshd、nginx等)。但如果你自己写的脚本也符合这些特征,请先手动确认后再运行,或临时把脚本名加入白名单。

Q:杀错了某个进程导致服务挂了怎么恢复?
A:如果该进程来自系统包管理器安装的软件(如apt、yum),重新安装即可:yum install -y 进程名。如果是你自己部署的服务,重新启动服务(systemctl start 你的服务)。

Q:这个脚本能防止再次被入侵吗?
A:不能防止入侵本身。查杀后建议:① 修改所有密码(SSH、数据库);② 更新系统补丁;③ 关闭不必要的端口;④ 安装安全软件(如ClamAV、Fail2Ban)。

如果你正被CPU100%问题困扰,建议先把脚本跑一遍,确认没有异常进程后再做后续安全加固。
遇到报错或脚本执行无反应,欢迎留言交流。

分享到:
上一篇
跳转收录权重流失修复完整配置方案
下一篇
慢查询批量优化脚本解决数据库卡顿问题
1
系统公告

机房迁移升级通知

尊敬的用户: IP 段 103.23.148.x、156.224.29.x 原香港一区线路波动、攻击频繁,平台定于 7 月 5 日凌晨分批迁移至香港 GIA 机房,硬件升级 AMD 铂金机型。 迁移均在凌晨操作,最大程度降低业务影响,迁移期间服务器临时关机; 升级后配置不降低、费用不涨价,数据默认同步迁移; 迁移后 IP 全部更换,请及时修改域名解析、防火墙白名单; 建议提前备份重要数据,有问题可联系在线客服。 感谢理解与支持! 泽御云科技 2026.06.30
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意