ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

rwho与rwhod:局域网Linux用户登录状态查看工具详解

rwho与rwhod:局域网Linux用户登录状态查看工具详解 如果你维护过几台 Linux 服务器一定遇到过这种场景明明排好的维护窗口只有你一个人上线结果 ssh 过去一看磁盘空间被占了大半执行w才发现同事半小时前就登进来在跑编译任务。一两台机器的时候who、w足够用可一旦你有三四台、七八台实验节点或者机房测试机挨个登录去看who就很笨了。rwho就是为解决这种场景出现的——它把“who”从单机扩展到了局域网范围。这个命令本身很轻真正干活的是它背后的rwhod守护进程把本机用户登录信息周期性地广播到网段里。这篇文章我会用实操方式把 rwho 的部署、使用、原理和排障完整过一遍适合内网机房、实验室、培训教室这类不复杂但协作频繁的系统管理环境。1. rwho 到底是什么一个把 who 扩展到局域网的老家伙1.1 核心机制rwhod 守护进程 广播协议rwho全称是 remote who源自 BSD Unix上世纪八十年代就出现了。它和普通命令不太一样不是每敲一次就去远程机器上问一次而是依赖一个常驻服务rwhod。rwhod 每隔大约 60 秒把本机的主机名、系统运行时长、当前登录用户列表打包通过 UDP 协议往本地子网的广播地址发送。另一台机器上的rwho客户端只是被动监听网络里的广播包收到多少台主机的数据就显示多少台。这种设计放在今天看有点“原始”但在当年非常合理。早期没有集中目录服务广播能做到“插上电就自动发现整个局域网”不需要配置服务器列表也省去了挨个主机做探测的麻烦。它的软肋同样明显广播包只能在一个二层广播域里传播路由器默认不转发所以 rwho 看不到跨网段、跨 VLAN 的机器。这不是 rwho 偷懒是它赖以为生的广播协议本身就出不了广播域。1.2 rwho、who、w 有什么不一样很多刚开始接触系统管理的人会把这三个命令搞混以为 rwho 是 who 的“网络升级版”其实它们的数据来源和定位差别很大。命令显示范围数据来源是否含负载/命令信息who本机本地 utmp 文件否w本机utmp proc 等是能看负载和当前命令rwho局域网内所有运行 rwhod 的机器网络 UDP 广播包否w展示的内容最丰富能看到每个终端上正在执行什么命令但它的视野限于单台机器。rwho恰恰相反内容很薄只有主机名、用户名、终端和登录时间却能覆盖整个局域网。实际使用中我会把它们搭配起来先用rwho找出“哪台机器有人”再 ssh 到那台机器用w看细节。1.3 适合什么环境不适合什么环境根据我的实操体会rwho 最舒服的舞台是实验室、培训机房、开发测试环境这类“一个网段、几十台以内、不用跨路由”的场景。尤其是当你需要判断哪台测试机空闲、哪台被同事占着跑批处理rwho 一眼就能扫完。它不适合公网、跨机房专线以及安全要求较高的生产环境原因会在后面的原理章节详细展开核心就四个字明文、无认证。2. 把 rwhod 服务先搭起来没有它 rwho 什么也看不到2.1 先看看系统里装没装大多数 Linux 发行版默认不会安装 rwho 相关组件因为这东西默认不启用更好。先执行下面三条命令探路which rwho which rwhod systemctl status rwhod如果which没有任何输出说明客户端和服务端都没装。如果systemctl提示服务不存在同样说明没装。如果只有rwho而没有rwhod那你现在敲rwho也只是看本机广播什么都收不到因为本机没服务在网段里发数据。2.2 安装并启动 rwhod我用 Debian/Ubuntu 系做演示原因是这类发行版对老牌网络工具的保留比较完整sudo apt update sudo apt install -y rwho sudo systemctl enable --now rwhod sudo systemctl status rwhodRHEL/CentOS/Rocky 系仓库里一般也有同名或近似的包建议先dnf search rwho确认一下再用sudo dnf install rwho安装。装好之后同样用 systemctl 操作服务。安装包会同时提供rwho客户端和rwhod服务不需要分开装。服务启动成功后可以在本机查一下端口状态sudo ss -unlp | grep 513正常情况下你会看到类似0.0.0.0:513的监听结果协议是 udp。如果这项命令有输出说明 rwhod 已经正常监听并开始准备广播了。提示rwhod 使用的端口是 UDP 513。端口号小于 1024属于特权端口所以服务必须用 root 身份启动普通用户手动跑 rwhod 会直接报 Permission denied。2.3 用防火墙把 rwho 圈在内网范围rwhod 默认会向本机所有接口广播。如果这台机器有多个网卡其中一张连着办公网一张连着机房管理网广播就可能泄露到不该去的地方。最稳妥的收敛方式不是去改 rwhod 的启动参数不同发行版差异大而是直接在防火墙层限定来源网段。Ubuntu 的 ufw 示例sudo ufw allow from 192.168.10.0/24 to any port 513 proto udpCentOS/Rocky 的 firewalld 示例sudo firewall-cmd --permanent --add-rich-rulerule familyipv4 source address192.168.10.0/24 port port513 protocoludp accept sudo firewall-cmd --reload注意只放行内网管理段范围越小越安全。rwho 本来就是一个用于内网协作的工具完全没必要对互联网开放。2.4 确认广播真的发出去了服务起来了端口也监听了接下来验证包有没有真正到网段里。用 tcpdump 在任意一台同网段机器上抓包sudo tcpdump -i any udp port 513 -c 10等 60 秒左右应该能收到类似这样的广播包11:03:22.123456 IP 192.168.10.21.513 255.255.255.255.513: UDP, length 110看到255.255.255.255这个目的地址说明广播行为正常。如果抓不到检查 rwhod 是否在运行、防火墙是否拦截了入站方向 UDP 513、以及网卡是否真的在目标网段内。3. rwho 命令实操与输出解读3.1 直接执行 rwho先看输出长什么样装好组件、服务跑起来之后在任意一台机器上直接敲rwho输出大概长这样lab01 zhangsan:pts/0 10月 05 09:31 lab02 lisi:pts/1 10月 05 08:56 dev-pc wangwu:tty2 10月 05 11:02每行代表“某个用户登录在某台主机的某个终端”。左起第一列是主机名第二列是用户名和终端名用冒号分隔第三列是登录日期时间。数据全部来自解析网络广播包不读本地 utmp/wtmp所以即使你从没登录过某台机器也能看到那台机器上其他人的登录状态。这里有一个非常重要的默认行为rwho 只显示“新鲜”的主机和用户。具体来说超过一分钟没收到广播的主机会被忽略空闲超过一个小时的用户默认也不会显示。这么设计是为了避免把休眠终端、僵尸会话全都堆到屏幕上但对刚接触的人而言很容易误以为 rwho 坏了。3.2 用 -a 参数把“隐形”用户找出来默认过滤掉空闲超过 1 小时的人本意是让界面干净但实操中会踩坑。我自己就干过一次看 rwho 列表里某台测试机没人准备 reboot 收拾环境结果手按下去之前多看了一眼发现几十秒前有同事从 IDE 连上去跑 demo只是会话挂机超过一小时被默认过滤了差点把人家辛辛苦苦跑的结果给清了。从那以后凡是涉及到重启、清理磁盘、关闭服务这类“有破坏性”的操作前我都会加参数看一眼rwho -a-a是 all 的意思把所有用户都列出来不管对方空闲了多久。它并不会把已经断开连接的会话找回来只是放宽默认过滤条件。建议大家在团队共享测试机的时候把rwho -a作为默认习惯。3.3 对 rwho 输出做二次加工裸输出可读性一般主机名和用户名长短不齐时尤其乱。我经常用column -t重新对齐rwho | column -t效果是列宽自动调整一眼看过去清爽很多。如果想要统计每台机器上有多少在线用户可以用 awk 组合rwho -a | awk {print $1} | sort | uniq -c | sort -rn第一列输出机器名后面跟在线用户数。排序数字大的放前面方便快速找到最拥挤的节点。类似地如果想统计有多少个不同的登录用户而不是登录会话数就把统计目标从第一列换成用户名rwho -a | awk {print $2} | sed s/:.*// | sort | uniq -c | sort -rn这里的sed s/:.*//是把zhangsan:pts/0截断成zhangsan。实际敲过就知道rwho 的价值一半在命令本身另一半在管道组合。3.4 用 watch 做实时刷新系统管理时如果想盯着某台机器等它释放可以在一个终端里挂 watchwatch -n 60 rwho每 60 秒刷新一次正好和 rwhod 的广播周期一致。之前我在培训机房维护时就靠这个命令一边处理网络问题一边实时确认哪些机器已经空出来了。4. 深入原理rwho 的数据从哪里来为什么会被冷落4.1 广播机制决定了它的活动范围rwho 从设计上就不是一个“主动探测”型工具。rwhod 发出的是目的地址为广播地址的数据包交换机收到后会把它转发给同广播域内所有设备。一旦涉及路由器和三层交换机广播包就默认不会跨网段继续走。这就是为什么你在 VLAN 10 里永远看不到 VLAN 20 的机器哪怕它们物理上就在同一台交换机上。这个机制带来的副产品是零配置。新增一台主机只要装上 rwho 组件并启动 rwhod自动就会被网段内其他机器发现不需要改任何配置。对于十几台设备的小环境这个优点非常实用。4.2 广播包内部到底有什么rwhod 发出的 UDP 数据包里主要包含这样几类信息主机名、系统启动时间、在线用户列表。用户列表里的每个条目又包含用户名、终端名、终端空闲时间等字段。rwho 客户端拿到数据包后只做一件事按一定格式打印出来。它不会主动请求某台主机“把数据给我”因此也不存在“拉取失败”的概念——收不到就是广播没到。我在破包的时候看到过一点非常有“年代感”的细节用户列表里甚至包含终端类型和登录源地址这类信息。换句话说内网里任何人只要有权限抓包就能在广播上看到全网的登录账号。这也是 rwho 无法进入强安全环境的根本原因之一。4.3 为什么生产环境里它逐渐被替代rwho 被冷落不是因为它不好用而是因为现代网络环境变了安全要求也变了。第一UDP 513 无认证、无加密用户可以伪造数据包往广播地址里塞假登录信息让 rwho 输出失真。第二登录用户名在网络上明文裸奔落到内网监听者手里等于白送一份账号字典。第三广播协议本身对网络链路有一定负担机器多、用户多、广播周期短的场景下包数量会线性增长。现代替代方案其实不是 rwho 的“增强版”而是换了一条路集中跳板机统一纳管所有登录会话Prometheus/Zabbix 之类的监控系统负责采集在线状态和资源指标日志集中采集负责审计。但在隔离、可信的小网络里rwho 依然有它不可替代的价值——部署成本和运维成本几乎为零一条命令扫全场。5. 常见问题排查与排障实录5.1 rwho 输出完全为空这是装完后最常见的故障。先别急着怀疑安装出了问题按顺序排查本机 rwhod 有没有启动systemctl status rwhod端口有没有监听sudo ss -unlp | grep 513网段里有没有广播sudo tcpdump -i any udp port 513 -c 10防火墙有没有放行 UDP 513检查 ufw 或 firewalld 规则绝大多数情况都是第 1 步或第 4 步的问题。服务忘了启动或者防火墙默认策略 drop 掉了入站 UDP广播包进不来rwho 自然什么都看不到。5.2 能看到本机但看不到其他机器这个现象要区分两种情况。第一对端机器根本没跑 rwhod它不会出现在任何人的 rwho 列表里第二两台机器不在同一个广播域可能是 VLAN 划分、物理交换机隔离或者中间存在路由器。还有一个容易忽略的点rwhod 默认向所有接口广播但 tcpdump 时你可能只抓了某一个接口的包要先确认接口选对了。我曾经排查过一次“四台机器只有一台能看到别人”的问题折腾半天发现是三台机器的防火墙把 UDP 513 的 INPUT 给 DROP 了只放行了 SSH。这种“服务正常、端口正常但防火墙不放行”的坑比服务没启动更隐蔽。5.3 明明有人登录rwho 却不显示先回忆默认过滤规则空闲超过一个小时的人不显示超过一分钟没收到广播的主机不显示。如果用户挂着一个过期终端超过一小时默认rwho里失踪是正常的要加-a。如果加完-a还是看不到某台机器基本可以断定广播新鲜度问题也就是对端 rwhod 可能中途挂了或者网络临时抖动导致广播中断。可以 ssh 到对端手动重启 rwhodsudo systemctl restart rwhod重启后最多等 60 秒广播就会重新出现在网段里。5.4 rwhod 启动失败提示 Permission denied这个错误几乎都是因为用普通用户直接执行了 rwhod。UDP 513 是特权端口普通用户没有权限绑定。解决办法有两个一是用 systemd 统一管理服务以 root 身份启动二是如果确实需要手工调试加 sudosudo rwhod需要说明的是直接前台跑 rwhod 调试时屏幕上通常不会打印内容看起来像“卡住”但其实它正在后台往网段里广播数据。此时另开一个终端抓包或者敲 rwho 就能看出效果。5.5 问题速查表现象最可能原因排查动作rwho 输出完全为空rwhod 未启动systemctl status rwhod输出为空且服务正常防火墙拦截 UDP 513检查 ufw/firewalld 规则看不到某几台机器不在同一广播域检查 VLAN 和交换机隔离用户在线但不显示空闲超过 1 小时使用 rwho -a服务启动报 Permission denied非 root 启动用 systemctl 或 sudotcpdump 抓不到广播网卡接错或服务异常换接口抓包并重启 rwhod6. 我的实操心得与几条补充建议6.1 把 rwho -a 设成默认习惯我现在只要敲 rwho基本都是直接敲rwho -a。原因很简单默认过滤规则在协作环境里会掩盖真实状态。共享测试机上挂着好几个长期会话是常态如果只看默认输出你会误判“机器没人用”然后做出重启、装软件、改配置这类决定。-a成本极低收益是少惹祸。6.2 别把 rwho 当安全审计依据rwho 的数据来源是 UDP 广播没有认证、没有加密任何人都可以伪造。拿它的输出去证明“某用户当时不在线”在安全审计意义上站不住脚。它只适合做操作前的人工确认、临时性的在线状态查看这类轻量用途。真正需要留痕和审计的登录行为应该走堡垒机、集中日志和带签名的认证系统。6.3 维护前的黄金三连我自己在操作共享服务器前固定会执行三个命令已经养成肌肉记忆rwho -a w uptimerwho -a看局域网全局有没有人占机器w看本机每个终端的活动情况uptime看负载和运行时长。三连下来基本能判断这台机器现在是安静状态还是有人正在跑任务。尤其是准备重启前多花十秒钟跑一遍远比事后跟同事解释为什么踢掉了他的任务划算。6.4 如果将来需要跨网段怎么做rwho 跨不了网段这是广播协议决定的。如果你确实有跨 VLAN 查看在线用户的需求就不要继续在 rwho 上折腾了尽早用集中跳板机或者监控系统替代。我自己在管理一个跨网段实验环境时就只把 rwho 用在同一 VLAN 的一批测试机上另外用一个小脚本定期采集所有主机的登录日志并汇总到值班群。工具没有新旧之分关键看用得合不合适。rwho 这种老命令只要放进适合它的位置依然能在日常系统管理里帮你省下大量重复登录的时间。
返回列表