核心是用grep精准过滤非白名单公网监听端口:先排除本地地址和合规服务,再匹配0.0.0.0或:::开头的listen行,最后用awk提取端口-pid-命令三元组并结合白名单核查。

检测所有开启外部监听的异常端口,核心是“先筛出非白名单公网监听项,再用 grep 精准过滤干扰、提取关键字段”。不靠人工肉眼扫,而是让 grep 成为巡检脚本里的判断引擎和提纯器。
用 grep 过滤掉本地回环和已知服务
ss 或 netstat 输出中混杂着 127.0.0.1、::1、已知合规服务(如 sshd、nginx),这些必须排除,否则无法聚焦异常:
- 过滤本地地址:
ss -tuln | grep -v '127\.0\.0\.1\|::1' - 排除标准服务进程:
grep -vE 'sshd|nginx|apache|redis-server|mysqld' - 合并写法示例:
ss -tuln | grep -v '127\.0\.0\.1\|::1' | grep -vE 'sshd|nginx|mysql'
用 grep 提取真正对外暴露的监听行
只保留绑定在 0.0.0.0 或真实公网 IP 上、且状态为 LISTEN 的行——这是异常端口最典型的特征:
- 匹配 IPv4 公网监听:
grep '0\.0\.0\.0:[0-9]\+.*LISTEN' - 匹配 IPv6 公网监听:
grep '\[::\]:[0-9]\+.*LISTEN\|:::[0-9]\+.*LISTEN' - 一行收口:
ss -tuln | grep -E '0\.0\.0\.0:[0-9]+.*LISTEN|\[::\]:[0-9]+.*LISTEN|:::[0-9]+.*LISTEN' | grep -v '127\.0\.0\.1\|::1'
用 grep + awk 快速生成待核查端口清单
巡检脚本不需要显示全部字段,只需干净的“端口→PID→命令”三元组,方便后续验证:
- 从 ss 输出中提取端口和 PID:
ss -tulpn | awk '$1 ~ /tcp/ && $5 ~ /0\.0\.0\.0:/ {split($5,a,":"); print a[2], $7}' | grep -v '^[0-9]\+ -' - 结合白名单过滤(假设白名单存于 /etc/port-whitelist):
while read p; do ss -tulpn | grep ":$p " >/dev/null || echo "$p"; done
用 grep 标记高危模式,触发分级响应
grep 可以充当轻量级规则引擎:匹配特定字符串即代表风险升级,直接驱动脚本分支逻辑:
- 发现无文件进程:
ls -l /proc/$PID/exe 2>&1 | grep "No such file" - 发现可疑用户启动:
ps -o user= -p $PID | grep -E 'nobody|daemon|ftp|guest' - 发现非常规路径二进制:
ls -l /proc/$PID/exe | grep -E '/tmp|/dev/shm|/var/tmp' - 脚本中可写:
if lsof -iTCP -sTCP:LISTEN -P -n 2>/dev/null | grep ":$PORT" | grep -q "root.*python"; then echo "high-risk"; fi
grep 在巡检中不是辅助工具,而是策略落地的执行触点。它把“哪些算异常”的业务规则,翻译成可嵌入管道、可条件判断、可日志标记的文本模式。写得准,后面关得稳。











