users [选项] [文件]
如果不指定文件,默认使用 /var/run/utmp 或 /var/log/wtmp 文件。
| 选项 | 说明 |
|---|---|
--help |
显示帮助信息 |
--version |
显示版本信息 |
[文件] |
指定要读取的文件(如/var/log/wtmp) |
users 命令的选项较少,大多数系统上只有 --help 和 --version 两个选项。
users
# 查看最近的历史登录记录
users /var/log/wtmp
# 查看历史登录记录,并按用户统计
users /var/log/wtmp | xargs -n1 | sort | uniq -c | sort -nr
users | tr ' ' '\n' | sort | uniq -c | sort -nr
users --help
users --version
users | xargs -n1
# 检查root用户是否在线
users | grep -q root && echo "root在线" || echo "root不在线"
# 检查多个用户
for user in root alice bob; do
if users | grep -q "$user"; then
echo "$user 在线"
else
echo "$user 不在线"
fi
done
$ users
root root alice bob alice
这表示:root有2个会话,alice有2个会话,bob有1个会话。
$ users | xargs -n1
root
root
alice
bob
alice
$ users | tr ' ' '\n' | sort | uniq -c | sort -nr
2 root
2 alice
1 bob
$ users /var/log/wtmp | head -5
root
root
alice
bob
root
| 命令 | 输出内容 | 详细程度 | 适用场景 |
|---|---|---|---|
users |
只显示用户名(每会话一个) | 最简单 | 快速查看谁在线,脚本中使用 |
who |
用户名、终端、时间、来源IP | 中等 | 查看登录详情 |
w |
用户名、终端、时间、来源IP、当前命令 | 最详细 | 查看用户活动和负载 |
last |
历史登录记录(包括登出时间) | 历史记录 | 审计和历史分析 |
finger |
用户详细信息(全名、家目录等) | 用户信息 | 获取用户个人信息 |
#!/bin/bash
# 监控用户登录变化
PREV_USERS=$(users | sort)
echo "开始监控用户登录状态..."
echo "当前用户: $PREV_USERS"
while true; do
CURRENT_USERS=$(users | sort)
if [ "$CURRENT_USERS" != "$PREV_USERS" ]; then
echo "[$(date '+%H:%M:%S')] 用户状态变化:"
echo "之前: $PREV_USERS"
echo "现在: $CURRENT_USERS"
echo "---"
PREV_USERS=$CURRENT_USERS
fi
sleep 5
done
#!/bin/bash
# 生成用户登录统计报告
REPORT_FILE="/var/log/daily_user_report_$(date +%Y%m%d).txt"
echo "=== 每日用户登录统计报告 ===" > $REPORT_FILE
echo "生成时间: $(date)" >> $REPORT_FILE
echo "" >> $REPORT_FILE
# 当前在线用户
echo "当前在线用户:" >> $REPORT_FILE
users | xargs -n1 | sort | uniq -c | sort -nr >> $REPORT_FILE
echo "" >> $REPORT_FILE
# 今日登录统计(从wtmp文件)
echo "今日登录历史:" >> $REPORT_FILE
last -w | grep "$(date '+%b %d')" | awk '{print $1}' | sort | uniq -c | sort -nr >> $REPORT_FILE
echo "" >> $REPORT_FILE
# 系统总用户数
echo "系统用户统计:" >> $REPORT_FILE
echo "总用户数: $(getent passwd | wc -l)" >> $REPORT_FILE
echo "可登录用户数: $(getent passwd | grep -E ":/bin/(bash|sh|zsh)" | wc -l)" >> $REPORT_FILE
echo "报告已保存到: $REPORT_FILE"
#!/bin/bash
# 检查工作时间(9:00-18:00)的用户活动
WORK_START="09:00"
WORK_END="18:00"
CURRENT_TIME=$(date +%H:%M)
if [[ "$CURRENT_TIME" > "$WORK_START" && "$CURRENT_TIME" < "$WORK_END" ]]; then
ONLINE_USERS=$(users | xargs -n1 | sort -u)
USER_COUNT=$(echo "$ONLINE_USERS" | wc -l)
echo "工作时间用户报告 ($CURRENT_TIME)"
echo "在线用户数: $USER_COUNT"
echo "用户列表:"
echo "$ONLINE_USERS"
# 如果用户太少,发送警告
if [ $USER_COUNT -lt 3 ]; then
echo "警告:在线用户数异常少!" | mail -s "用户活动异常" admin@example.com
fi
else
echo "当前是非工作时间 ($CURRENT_TIME)"
fi
root root alice bob alice#!/bin/bash
# 系统维护前检查脚本
echo "=== 系统维护前用户检查 ==="
echo "检查时间: $(date)"
# 检查在线用户
ONLINE_USERS=$(users)
if [ -n "$ONLINE_USERS" ]; then
echo "警告:有以下用户在线:"
echo "$ONLINE_USERS" | xargs -n1 | sort -u
# 发送警告消息给在线用户
for USER in $(echo "$ONLINE_USERS" | xargs -n1 | sort -u); do
echo "系统将在5分钟后进行维护,请保存工作并退出。" | write $USER
done
echo "已发送维护通知给所有在线用户"
echo "请等待用户退出后再进行维护操作"
else
echo "没有用户在线,可以开始维护"
fi
#!/bin/bash
# 监控异常SSH登录尝试
LOG_FILE="/var/log/auth.log"
ALERT_THRESHOLD=10 # 10分钟内10次失败尝试
# 检查最近的失败登录
FAILED_COUNT=$(grep "Failed password" $LOG_FILE | grep -E "$(date -d '10 minutes ago' '+%b %d %H:%M')" | wc -l)
if [ $FAILED_COUNT -gt $ALERT_THRESHOLD ]; then
# 获取当前在线用户
CURRENT_USERS=$(users | xargs -n1 | sort -u | tr '\n' ', ')
# 发送警报邮件
SUBJECT="SSH暴力破解警报"
MESSAGE="检测到SSH暴力破解尝试!\n"
MESSAGE+="时间: $(date)\n"
MESSAGE+="过去10分钟失败尝试: $FAILED_COUNT\n"
MESSAGE+="当前在线用户: $CURRENT_USERS\n"
MESSAGE+="请立即检查!"
echo -e "$MESSAGE" | mail -s "$SUBJECT" admin@example.com
echo "$(date): SSH暴力破解警报 - $FAILED_COUNT次尝试" >> /var/log/security_alerts.log
fi
users 命令只显示用户名,不显示登录时间、来源IP等详细信息who、w 或 last 命令users 读取的是 /var/run/utmp 文件,该文件只包含当前登录会话/var/log/wtmp 文件users 命令通常包含在coreutils软件包中,大多数Linux发行版默认已安装。
# 检查是否已安装
which users
users --version
# Ubuntu/Debian安装(如果需要)
sudo apt-get install coreutils
# CentOS/RHEL/Fedora安装
sudo yum install coreutils
# 验证安装
users --help
| 文件 | 内容 | 用途 |
|---|---|---|
/var/run/utmp |
当前登录会话信息 | users, who, w 命令的数据源 |
/var/log/wtmp |
历史登录会话记录 | last 命令的数据源,users 也可以读取 |
/var/log/btmp |
失败的登录尝试 | lastb 命令的数据源 |
/etc/passwd |
系统用户账户信息 | 用户基本信息,如用户名、UID、家目录等 |
users 命令显示的是登录会话,而不是用户。如果一个用户从多个终端登录(例如同时打开多个SSH连接,或者既有SSH连接又有本地登录),那么每个登录会话都会在输出中显示一次该用户名。
这是正常现象,表示该用户有多个活动的登录会话。
主要区别:
使用场景:
userswhousers 命令只显示当前登录的用户。要统计系统总用户数,需要使用其他命令:
# 统计系统所有用户
getent passwd | wc -l
# 统计可登录的用户(有shell的用户)
getent passwd | grep -E ":/bin/(bash|sh|zsh|tcsh)" | wc -l
# 查看所有用户列表
cut -d: -f1 /etc/passwd