排查历史命令
cat .bash_history #仅包含之前会话保存的命令
history #包含当前会话执行的所有命令
查看计划任务
存储用户级别的计划任务定义文件
cat /var/spool/cron/crontabs/root #查看特定用户的任务(如 root)
如果返回空或"no such file",表示该用户无计划任务
记录 cron 进程的活动日志
cat /var/log/cron #计划任务执行日志
查看规定时间内修改的文件
find / -name "*.php" -mtime -30
命令解析
- find / :
从根目录 / 开始递归搜索所有子目录 - -name “*.php” :
匹配所有以 .php 结尾的文件(需要用引号包裹) - -mtime -30:
过滤出最近30天内被修改过的文件(以天为单位,-30表示”小于30天“)
检查系统完整性
验证系统关键目录中的文件是否被篡改
rpm -Vf /usr/sbin/*
或
rpm -Vf /usr/bin/*
命令解析
- rpm
Red Hat 包管理器 - -V
验证模式:检查文件完整性 - -f
指定要验证的文件路径(而非软件包名) - /usr/sbin/* 和 /usr/bin/* 的区别
/usr/sbin/ 是系统管理命令(如 sshd, iptables, cron)
/usr/bin/ 用户级命令(如 ls, ps, bash, python) - ’ * ’ 通配符
检查目录下的所有非隐藏文件
典型输出示例
情况一:file … is not owned by any package(文件未被任何包管理)
这意味着里面的文件不是通过系统的RPM包管理器安装的
情况二:带字母标记的输出 (如 S.5…T. /usr/sbin/sshd)
这种格式的输出表明文件 /usr/sbin/sshd 是由某个 RPM 包管理的,但是它的一个或多个属性与 RPM 数据库记录的该文件最初安装时的状态不一致。
rpm -V 的输出格式通常是:
标记 文件属性 文件名
位置是固定的,顺序为:S, M, 5, D, L, U, G, T
拿例子说明: (如 S.5…T. /usr/sbin/sshd)
- 第1位 S:文件 Size (大小) 不一致。文件的当前大小与安装时记录的大小不同
- 第2位 .:文件 Mode (权限/类型) 一致。没有 M 标记,说明权限位(rwx)和文件类型(普通文件、目录等)匹配
- 第3位 5:文件 MD5 checksum (校验和) 不一致。文件的当前内容计算出的 MD5 哈希值与安装时记录的值不同。这就证明内容被修改了!
- 第4位 .:Device (设备号) 一致。对于设备文件才有意义,普通文件此项通常为 .
- 第5位 .:Symbolic Link (符号链接目标) 一致。文件不是符号链接或其指向的路径未变
- 第6位 .:User (属主) 一致。文件的所有者用户未变
- 第7位 .:Group (属组) 一致。文件的所属用户组未变
- 第8位 T:mTime (修改时间) 不一致。文件的最后修改时间与安装时记录的时间不同
排查网络连接情况
方法一:
查看系统中所有TCP/UDP网络连接、监听端口及相关进程
netstat -antup
参数解析
- -a:显示所有连接和监听的端口(包括已建立的和等待连接的)
- -n:用数字形式显示地址和端口(不解析主机名、服务名,加快输出速度)
- -t:仅显示 TCP 协议连接
- -u:仅显示 UDP 协议连接
- -p:显示进程标识符(PID)和程序名(需 root 权限查看所有进程)
netstat -antup 输出详情
- proto(协议)
连接使用的传输层协议:tcp / udp / tcp6 / udp6 - recv-Q(接收队列)
等待应用程序读取的数据量(字节)
对于 LISTEN 状态:通常是 0(表示无积压)
对于 ESTABLISHED 状态:未被应用程序读取的数据大小 - Send-Q (发送队列)
等待发送给对方的数据量(字节)
对于 LISTEN 状态:最大积压连接数(Linux 2.2+)
对于 ESTABLISHED 状态:未被对方确认的数据大小 - Local Address (本地地址)
本地 IP + 端口(格式:IP:端口)
关键标识:
0.0.0.0:监听所有 IPv4 接口
127.0.0.1:仅监听本地回环
:::监听所有 IPv6 接口 - Foreign Address (远程地址)
远程主机 IP + 端口
特殊值:
0.0.0.0:*:未建立连接(LISTEN 状态) - State (连接状态)
LISTEN ---------------服务正在监听端口
ESTABLISHED -----已建立连接
TIME_WAIT ---------等待关闭完成(2MSL 状态)
SYN_SENT ---------主动发起连接
CLOSE_WAIT ------等待本地关闭 - PID/Program name (进程信息)
格式:PID / 程序名
显示占用该连接的进程
需要 root 权限才能查看所有进程
方法二:
与 netstat 功能相同,但更高效、更现代(更加推荐)
ss -antup
参数解析(与 netstat 一致)
- -a:所有连接/监听端口。
- -n:数字格式显示。
- -t:TCP 连接。
- -u:UDP 连接。
- -p:显示进程信息(需 root 权限)
ss -antup 输出列详解
- Netid (网络标识)
连接类型:tcp / udp / icmp / raw 等 - State (状态)
- Local Address:Port (本地地址)
格式:IP:端口
支持 IPv6 地址(如 [::]:80) - Peer Address:Port (远程地址)
通信对端的 IP + 端口 - Process (进程详情)
详细格式:users:((“程序名”,pid=PID,fd=文件描述符))
直接显示进程使用的文件描述符(fd)
方法三:
列出所有正在使用网络连接的进程(IPv4/IPv6 的 TCP/UDP 连接)
lsof -i
参数解析:
- -i 仅显示网络连接
lsof -i 输出列详解
- COMMAND:进程名称(如 nginx)
- PID:进程 ID
- USER:运行进程的用户
- FD:文件描述符(关键标识)
数字+字母 如 8u:数字=文件描述符,字母=访问模式(u=读写,r=只读) - TYPE:文件类型
IPv4/IPv6:网络套接字
REG:普通文件
DIR:目录 - DEVICE:设备号
- SIZE/OFF:文件大小/偏移量
- NODE:Inode 号
- NAME:核心信息
网络连接:[协议] 本地地址->远程地址 (状态)
普通文件:文件绝对路径
紧接着可以用下面的命令查看指定进程打开的所有文件(包括网络连接、普通文件、管道等)
lsof -p PID
参数解析:
- -p PID 指定要查询的进程 ID
- -p 123,456 查询多个进程(逗号分隔)
- -p ^nginx 排除特定进程(排除 nginx)
输出列详情
同上
这里以 lsof -p 7171 为例