CPU占用100%恶意进程一键定位查杀脚本
服务器CPU突然飙到100%,负载居高不下,top一看全是陌生进程占满CPU。
这种情况大概率是中了挖矿木马或恶意脚本。
手动排查费时又容易漏,今天我直接给你一个能一键定位、查杀并清理残留的Shell脚本,照着跑一遍就能恢复系统清净。
前置准备
- 环境要求:CentOS 7/8、Ubuntu 18.04+、Debian 10+ 均可,需要root权限或sudo。
- 操作工具:通过SSH连接到服务器(Windows用PuTTY,Mac/Linux直接终端)。
- 备份提醒:虽然脚本只会操作用户态进程,但最好提前备份重要数据,以防误杀后需恢复。
一键定位查杀脚本实战
下面脚本会做三件事:
- 找出CPU占用率最高的前10个进程,筛选出可疑进程(非系统关键进程、名称异常、网络连接异常)。
- 自动杀死这些进程,并删除对应的二进制文件。
- 清理常见的恶意自启动项(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
避坑指南:这些情况必须注意
- 误杀系统进程:脚本白名单只覆盖常见服务,如果你服务器跑着自定义的服务进程,需要在脚本开头手动加入白名单(例如
WHITELIST="你的进程名")。 - 恶意进程伪装成系统名:有些木马会改名为
[kworker]或[kswapd0]等内核线程名。脚本目前只通过外连检测判断,如果遇到纯本地潜伏的木马,可以结合ls -la /proc/$PID/exe查看实际二进制路径。 - 清理自启动重复出现:杀掉一次后又死灰复燃?说明有守护进程或定时任务没清干净。脚本已清理cron和systemd服务,但如果对方写入了
/etc/rc.local或~/.bashrc,需要手动检查这些文件。
效果验证:怎么确认问题已解决
- 运行
top或htop,查看CPU空闲率是否恢复正常。 - 运行
netstat -antp | grep ESTABLISHED,检查是否还有非本地的异常外连。 - 运行
ps aux --sort=-%cpu | head -5,确保无陌生进程持续占CPU。 - 观察几分钟,若CPU再次飙升,说明还有残留,重新执行脚本并检查之前漏掉的启动项。
FAQ:常见问题快速解答
Q:脚本安全吗?会不会把我的网站搞崩?
A:脚本只停止并删除在脚本执行时CPU占用极高且有外连的进程(白名单已过滤sshd、nginx等)。但如果你自己写的脚本也符合这些特征,请先手动确认后再运行,或临时把脚本名加入白名单。
Q:杀错了某个进程导致服务挂了怎么恢复?
A:如果该进程来自系统包管理器安装的软件(如apt、yum),重新安装即可:yum install -y 进程名。如果是你自己部署的服务,重新启动服务(systemctl start 你的服务)。
Q:这个脚本能防止再次被入侵吗?
A:不能防止入侵本身。查杀后建议:① 修改所有密码(SSH、数据库);② 更新系统补丁;③ 关闭不必要的端口;④ 安装安全软件(如ClamAV、Fail2Ban)。
如果你正被CPU100%问题困扰,建议先把脚本跑一遍,确认没有异常进程后再做后续安全加固。
遇到报错或脚本执行无反应,欢迎留言交流。