最可靠方式是ss -tn state established '( dport = :22 )' | wc -l,精准统计目标端口为22且状态为established的tcp连接数,避免listen、time_wait等干扰,不依赖grep文本匹配,适配生产环境。

直接看当前活跃的 SSH 连接数,最可靠的方式是统计状态为 ESTABLISHED 的 TCP 连接中目标端口为 22 的数量——不是看进程数,也不是靠 who 或 w,因为那些只反映登录会话,不等于网络连接本身。
用 ss 统计 ESTABLISHED 的 SSH 连接(推荐)
ss 是现代 Linux 默认预装、性能更好、输出更稳定的替代方案,比 netstat 更适合脚本和生产环境。
-
ss -tn state established '( dport = :22 )' | wc -l:精准匹配目标端口为 22 且状态为ESTABLISHED的连接(注意是dport,即本机监听的 22 端口,不是源端口) - 如果只想快速知道数字,这条命令足够;它不依赖
grep解析文本,避免因空格或字段偏移导致漏数 - 某些老内核或极简系统(如容器基础镜像)可能不支持
state+'( ... )'语法,可退化为:ss -tn | grep ':22' | grep 'ESTAB' | wc -l
用 netstat 查时要注意端口方向和状态过滤
netstat 仍可用,但必须明确过滤逻辑,否则容易把监听套接字(LISTEN)或非活跃连接(如 TIME_WAIT)混进来。
- 错误写法:
netstat -an | grep :22 | wc -l—— 会把LISTEN、TIME_WAIT、甚至本地连本地的调试连接全算进去 - 正确写法:
netstat -ant | awk '$1 ~ /^tcp/ && $6 == "ESTABLISHED" && $4 ~ /:22$/ {print}' | wc -l—— 只取协议为 tcp、状态为 ESTABLISHED、且本地地址以:22结尾的行 - 如果系统没装
net-tools(如 Ubuntu 22.04+ 默认不带),运行netstat会报command not found,此时别折腾安装,直接切到ss
查每个 IP 的连接数分布(防暴力扫描/异常登录)
单纯总数不够,常需定位哪个 IP 建了大量连接——比如被撞库或代理滥用。
ss -tn state established '( dport = :22 )' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr- 关键点:
$5是对端地址(格式如192.168.1.100:54321),cut -d: -f1提取 IP 段,uniq -c计数,sort -nr倒序排 - 注意:NAT 环境下多个用户可能共用一个公网 IP,单看 IP 数量不能直接等同于用户数
- 若发现某 IP 连接数异常高(如 >10),建议结合
lastb查失败登录,或临时用iptables限速
真正要确认“谁在连”,不能只信连接数——sshd 进程可能 fork 出多个子进程处理不同连接,但一个连接断开后子进程未必立刻退出;而 who 或 ps aux | grep sshd 显示的是会话或进程视图,和底层 TCP 连接不是一一映射。最准的永远是抓包层的连接状态,也就是 ss -tn state established 这条路径。











