Skip to main content

Ubuntu 18.04 ps命令丢失修复方案


报错 `Command 'ps' not found` 说明 **procps 软件包被病毒删除/损坏**,ps、top、vmstat 等进程查看工具都在这个包里,分两种场景修复。

## 一、能正常联网(直接安装修复)
### 1. 执行安装恢复procps
```bash
apt update
apt install -y procps
```
安装完成后直接测试:
```bash
ps -ef
```

### 2. 如果apt被篡改、无法执行
病毒经常篡改apt、替换源、删除依赖,先修复apt:
```bash
# 修复apt基础组件
apt --fix-broken install -y
apt install --reinstall apt
# 再重装procps
apt install --reinstall procps
```

## 二、服务器断网/外网不通(离线修复)
### 方案1:本地缓存包安装
1. 查看本机是否还有缓存安装包
```bash
ls /var/cache/apt/archives/procps*
```
如果存在文件,直接本地安装:
```bash
dpkg -i /var/cache/apt/archives/procps_*.deb
```

### 方案2:另一台同版本Ubuntu下载离线包上传
1. 干净Ubuntu18.04机器下载包
```bash
apt update && apt install --download-only procps
# 包路径 /var/cache/apt/archives/procps_xxx_amd64.deb
```
2. scp上传到故障服务器,执行安装
```bash
dpkg -i procps_*.deb
# 缺依赖就修复依赖
apt -f install -y
```

## 三、病毒篡改PATH导致命令找不到(关键排查)
部分恶意程序会修改环境变量`PATH`,即使程序存在也提示not found:
1. 先确认ps二进制文件是否存在
```bash
which ps
# 或直接查看真实路径
ls /bin/ps /usr/bin/ps
```
- 若文件不存在:按上面重装procps
- 若文件存在但无法执行:修复PATH
```bash
# 临时恢复完整PATH
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# 再次测试ps
ps -ef
```
2. 永久修复PATH(病毒大概率改了/etc/profile /root/.bashrc)
```bash
# 检查恶意PATH篡改
grep -r "PATH" /root/.bashrc /etc/profile /etc/environment
# 删除里面恶意覆盖PATH的行,恢复默认PATH
echo 'export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin' >> /etc/profile
source /etc/profile
```

## 四、修复后深度查杀(防止病毒再次删除工具)
### 1. 全盘查杀病毒
```bash
# 安装云安全中心Agent全盘扫描(阿里云主机)
# 或安装clamav开源杀毒
apt install -y clamav
freshclam
clamscan -r / --remove=yes
```
### 2. 锁定procps防止被删除
```bash
# 锁定软件包,病毒无法卸载
apt-mark hold procps
# 锁定ps二进制文件不可删
chattr +i /usr/bin/ps /bin/ps
```

### 3. 复盘之前的进程隐藏后门
之前告警是通过`mount --bind /proc/$PID /tmp`隐藏进程,病毒会持续删除系统工具规避排查:
1. 再次检查恶意挂载
```bash
mount | grep /tmp
umount -l /tmp
```
2. 清理定时任务、开机自启木马
```bash
crontab -l
ls /etc/cron.*
systemctl list-unit-files
```
3. 加固/tmp目录禁止执行二进制
```bash
mount -o remount,noexec,nosuid /tmp
echo "tmpfs /tmp tmpfs defaults,noexec,nosuid 0 0" >> /etc/fstab
```

## 快速一键修复脚本(复制直接运行)
```bash
#!/bin/bash
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
apt update
apt --fix-broken install -y
apt install --reinstall -y procps
apt-mark hold procps
chattr +i /usr/bin/ps /bin/ps
echo "=== 修复完成,测试ps ==="
ps -ef
```