用 w -h -u 可实时查看活跃SSH会话,TTY列以pts/开头、FROM列含IP即为有效SSH连接;who命令配合awk可精准提取用户名、终端号和来源IP;ps -t pts/N可验证终端归属用户,避免残留进程干扰。

要快速确认哪些IP正在通过SSH连接你的Linux服务器,并准确识别每个活跃会话对应的终端设备(如pts/0、pts/1)、用户和实时状态,不能只依赖进程数或历史日志。
用 w -h -u 直接看真实活跃SSH会话
运行 w -h -u 命令,它从 /var/run/utmp 实时读取,只显示真正活跃的登录会话,自动过滤掉已断开但未清理的僵尸连接。
输出中第二列为 TTY,所有以 pts/ 开头的行都代表 SSH 会话;第三列 FROM 显示来源 IP 或主机名,若为 ::0 或空,则不是 SSH 连接。
注意:w 默认按 CPU 使用率排序,刚登录还没执行命令的 SSH 用户可能被压到末尾;如需按登录时间判断新旧,应配合 who 或 last -n 20 | grep 'still logged in'。
用 who 精确提取 SSH 终端与来源
方法一:直接运行 who,观察 TTY 列是否为 pts/N,FROM 列是否含 IP 地址(非本地图形会话)。
方法二:筛选出全部 SSH 类型会话:who | awk '$2 ~ /^pts\/[0-9]+$/ {print $1, $2, $NF}' —— 这条命令能干净分离用户名、终端号和来源,避免 :0 或 tty1 干扰。
方法三:查某个特定用户的所有 SSH 终端:who | awk -v u="alice" ' == u && ~ /^pts\// {print }',结果就是该用户当前占用的伪终端编号,比如 pts/3。
用 loginctl 补全图形环境下的 SSH 关联会话(可选)
systemd 系统中,SSH 登录有时会触发关联的 user@.service,尤其在启用 PAM 或 systemd-logind 集成时。
列出所有用户会话并过滤 SSH 相关:loginctl list-sessions --no-legend | awk '{print $1}' | xargs -I{} loginctl show-session {} | grep -E '^(Type|State|User|TTY|Remote)' | paste - - - - - | grep 'Remote=yes'。
这步操作较重,仅当 w 和 who 显示异常(如看到 pts/4 却查不到对应用户)时才建议执行,【它依赖 systemd-logind 正常运行,Alpine 等非 systemd 容器中不可用】。
验证某 pts/N 终端归属哪个用户
第一步:确认终端是否存在且活跃:ls -l /dev/pts/,查看是否有对应编号的设备节点。
第二步:查该终端上运行的进程所属用户:ps -t pts/2 -o user=,comm= 2>/dev/null | head -n1,替换 pts/2 为你想查的编号。
第三步:比对结果与 who 输出。若不一致,说明该 pts 可能已被释放但进程残留,【此时不能认为是有效 SSH 会话】。


















