rwho 命令用于显示局域网中所有运行了 rwhod 守护进程的主机上当前登录用户的信息。它类似于 who 命令,但可以提供整个局域网的登录用户概览。
大多数Linux发行版需要手动安装rwhod包:
sudo apt-get update
sudo apt-get install rwho
# CentOS/RHEL 7及以下
sudo yum install rwho
# CentOS/RHEL 8及以上
sudo dnf install rwho
# Fedora
sudo dnf install rwho
# 手动启动
sudo systemctl start rwhod
# 设置开机自启
sudo systemctl enable rwhod
# 检查服务状态
sudo systemctl status rwhod
# 开放UDP 513端口(rwhod默认端口)
sudo firewall-cmd --add-port=513/udp --permanent
sudo firewall-cmd --reload
rwho [选项]
| 选项 | 说明 |
|---|---|
-a |
显示所有用户,包括闲置时间超过1小时的用户 |
| 无选项 | 仅显示在过去1小时内有活动的用户 |
rwho
示例输出:
alice server1:console Jan 12 09:30 5:30
bob workstation2:pts/0 Jan 12 10:15 0:45
charlie laptop3:tty1 Jan 12 08:00 7:00
rwho -a
显示局域网中所有登录用户,无论是否闲置超过1小时。
管理员可以定期运行rwho命令查看哪些用户在线:
# 每日上午9点查看登录情况
rwho
# 结合grep筛选特定用户
rwho | grep alice
# 查看哪些服务器上有用户登录
rwho | awk '{print $2}' | cut -d: -f1 | sort | uniq -c
# 按主机统计用户数
echo "=== 各主机登录用户统计 ==="
rwho | awk '{host=$2; sub(/:.*/, "", host); count[host]++} END {for (h in count) print h ": " count[h] " users"}'
#!/bin/bash
# 监控特定用户登录并发送通知
TARGET_USER="admin"
while true; do
if rwho | grep -q "^$TARGET_USER "; then
echo "$(date): $TARGET_USER 已登录到局域网" | mail -s "用户登录通知" admin@example.com
break
fi
sleep 300 # 每5分钟检查一次
done
rwho命令依赖以下文件和目录:
| 文件/目录 | 用途 |
|---|---|
/var/spool/rwho/ |
存储各主机状态信息的目录 |
/var/spool/rwho/rwhod.* |
各主机的状态数据文件 |
/usr/sbin/rwhod |
rwhod守护进程 |
/usr/bin/rwho |
rwho客户端程序 |
| 命令 | 功能 | 范围 | 特点 |
|---|---|---|---|
rwho |
查看局域网用户 | 整个局域网 | 需要rwhod服务支持 |
who |
查看本地登录用户 | 本地主机 | 默认可用,无需额外服务 |
w |
查看本地用户及进程 | 本地主机 | 显示更详细信息 |
finger |
查看用户详细信息 | 本地/远程 | 可查看用户个人信息 |
last |
查看登录历史 | 本地主机 | 历史记录查询 |
# rwho - 局域网用户
$ rwho
john server1:console Jan 12 09:00 4:30
# who - 本地用户
$ who
john tty1 2024-01-12 09:00
jane pts/0 2024-01-12 10:15
# w - 详细用户信息
$ w
10:25:15 up 4:30, 2 users, load average: 0.15, 0.10, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
john tty1 - 09:00 4:30m 0.10s 0.10s -bash
jane pts/0 192.168.1.100 10:15 0.00s 0.05s 0.00s w
rwho服务存在以下安全隐患:
考虑使用更安全的替代方案:
# 1. 使用SSH + who组合
ssh user@remote-host who
# 2. 使用LDAP或Active Directory查询
# 3. 使用专门的监控系统(如Zabbix、Nagios)
# 4. 使用自定义脚本(基于lastlog或wtmp)
# 1. 限制广播范围(如果支持)
# 编辑 /etc/default/rwhod 或类似配置文件
# 2. 使用防火墙限制访问
sudo firewall-cmd --remove-port=513/udp --permanent
sudo firewall-cmd --reload
# 3. 仅在内网可信环境中使用
# 4. 定期监控rwhod日志
可能的原因和解决方法:
# 1. 检查rwhod服务是否运行
sudo systemctl status rwhod
# 2. 检查网络连接和广播设置
ping -c 3 192.168.1.255 # 替换为您的广播地址
# 3. 检查防火墙设置
sudo iptables -L | grep 513
# 4. 检查数据文件
ls -la /var/spool/rwho/
# 确保所有主机都运行了rwhod服务
# 检查主机间的时间同步
date
sudo ntpdate -u pool.ntp.org
# 检查网络广播是否正常工作
sudo tcpdump -i eth0 udp port 513 -vv
# 在多台主机上执行who命令
ansible all -i inventory.ini -m command -a "who"
# 同时查看多台主机
cssh server1 server2 server3
# 然后在每个窗口执行who命令
#!/bin/bash
# 多主机用户监控脚本
HOSTS="server1 server2 server3"
for host in $HOSTS; do
echo "=== $host ==="
ssh $host "echo -n 'Users: '; who | wc -l"
done