要确认服务器上是否有非本机操作的外部用户正在登录,必须用 w -h 命令过滤出带 IP 或域名的远程会话,FROM 字段为 IPv4、IPv6 或域名即属外部用户,本地登录则显示为空、:0、localhost 或 127.0.0.1。

要确认服务器上是否有非本机操作的外部用户正在登录,比如通过 SSH 远程连接进来的管理员、运维或攻击者,必须排除本地终端(tty1、tty2)和图形界面伪终端(如 :0),只聚焦真实网络来源的会话。直接看用户名列表毫无意义,关键在识别 FROM 字段中的 IP 或主机名。
用 w 命令过滤出带 IP 的远程会话
执行 w -h,这一步会跳过顶部系统摘要行,只输出用户表格;【-h 参数不可省略,否则头部信息会混入结果,导致脚本解析失败】。
观察输出中 FROM 列:凡显示为 IPv4(如 192.168.1.105)、IPv6(如 fe80::20c:29ff:fe1a:3b4d)或域名(如 jumpserver.example.com)的行,即为外部用户;本地登录的 FROM 字段为空或显示 :0、localhost、127.0.0.1。
若需一键提取所有外部来源 IP 并去重,可运行:w -h | awk '$3 !~ /^(:|localhost|127\.0\.0\.1)$/ && $3 != "" {print $3}' | sort -u。
用 who 命令快速定位网络登录点
方法一:直接运行 who,逐行检查括号内的内容——只有带括号且括号内是 IP 或域名的条目才算外部用户,例如 alice pts/1 2026-11-13 17:22 (203.124.56.19)。
方法二:用正则精准抓取,执行 who | grep -E '\([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\)|\([^)]+[^[:space:]]+\)' | cut -d' ' -f1,2,5,它会筛掉所有本地会话并输出用户名、终端、来源。
注意:某些老旧系统或精简镜像可能禁用 utmp 写入,此时 who 输出可能缺失括号内容,应立即改用 w 验证。
确认是否真有外部用户在线(三步验证法)
第一步:运行 w -h | wc -l 查看当前活跃会话总数。
第二步:运行 w -h | grep -v '^[[:space:]]*[^[:space:]]*[[:space:]]*tty\|:0' | wc -l,过滤掉所有本地终端(tty*)和图形会话(:0),剩下即疑似远程会话数。
第三步:对第二步结果中每一行执行 echo "行内容" | awk '{print $3}' | grep -E '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+|^[a-zA-Z]' &>/dev/null && echo "确认为外部用户",逐个验证来源字段是否为有效网络标识。


















