linux users命令

users命令 用于显示当前登录系统的所有用户名。它是一个非常简单但实用的命令,输出简洁,只显示用户名,每个用户名对应一个登录会话。如果一个用户有多个登录会话,那么他的用户名将显示多次。

命令格式

users [选项] [文件]

如果不指定文件,默认使用 /var/run/utmp/var/log/wtmp 文件。

常用选项

选项 说明
--help 显示帮助信息
--version 显示版本信息
[文件] 指定要读取的文件(如/var/log/wtmp)
注意:users 命令的选项较少,大多数系统上只有 --help--version 两个选项。

使用实例

1. 显示当前登录用户(基本用法)
users
2. 查看历史登录记录
# 查看最近的历史登录记录
users /var/log/wtmp

# 查看历史登录记录,并按用户统计
users /var/log/wtmp | xargs -n1 | sort | uniq -c | sort -nr
3. 统计每个用户的登录次数
users | tr ' ' '\n' | sort | uniq -c | sort -nr
4. 查看帮助信息
users --help
5. 查看版本信息
users --version
6. 将输出格式化为每行一个用户
users | xargs -n1
7. 检查特定用户是否在线
# 检查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

实际输出示例

示例1:基本输出
$ users
root root alice bob alice

这表示:root有2个会话,alice有2个会话,bob有1个会话。

示例2:格式化输出
$ users | xargs -n1
root
root
alice
bob
alice
示例3:统计登录次数
$ users | tr ' ' '\n' | sort | uniq -c | sort -nr
      2 root
      2 alice
      1 bob
示例4:查看历史记录
$ users /var/log/wtmp | head -5
root
root
alice
bob
root

与相关命令对比

命令 输出内容 详细程度 适用场景
users 只显示用户名(每会话一个) 最简单 快速查看谁在线,脚本中使用
who 用户名、终端、时间、来源IP 中等 查看登录详情
w 用户名、终端、时间、来源IP、当前命令 最详细 查看用户活动和负载
last 历史登录记录(包括登出时间) 历史记录 审计和历史分析
finger 用户详细信息(全名、家目录等) 用户信息 获取用户个人信息

实用场景

快速检查
  • 快速查看谁在线
  • 检查系统是否有多人使用
  • 验证用户登录状态
  • 脚本中的条件判断
统计分析
  • 统计用户登录频率
  • 分析系统使用模式
  • 监控异常登录
  • 生成使用报告
安全监控
  • 检测未授权登录
  • 监控root用户登录
  • 审计用户活动
  • 安全合规检查
脚本编程
  • 自动化脚本中的用户检查
  • 系统维护时的用户通知
  • 批量用户管理
  • 监控脚本

实用命令组合

1. 实时监控用户登录/登出
#!/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
2. 生成每日用户登录报告
#!/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"
3. 检查特定时间段的用户活动
#!/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

如何理解输出结果

users命令输出解读
示例输出:root root alice bob alice
  1. 每出现一次用户名,表示该用户的一个登录会话
  2. root 出现了2次 → root用户有2个登录会话
  3. alice 出现了2次 → alice用户有2个登录会话
  4. bob 出现了1次 → bob用户有1个登录会话
  5. 可能的情况:
    • 同一用户从不同终端登录
    • 同一用户使用SSH和本地控制台同时登录
    • 用户打开了多个终端会话

实际应用示例

场景1:系统维护前检查用户
#!/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
场景2:监控SSH暴力破解
#!/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等详细信息
  • 如果需要更多信息,请使用 whowlast 命令
  • 在脚本中使用时,注意处理输出中的空格(用户间用空格分隔)
  • users 读取的是 /var/run/utmp 文件,该文件只包含当前登录会话
  • 要查看历史记录,需要指定 /var/log/wtmp 文件
  • 在某些系统上,可能需要root权限才能读取某些日志文件

安装说明

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连接又有本地登录),那么每个登录会话都会在输出中显示一次该用户名。

这是正常现象,表示该用户有多个活动的登录会话。

主要区别:

  • users: 只显示用户名,每个登录会话显示一次,输出非常简洁
  • who: 显示详细信息,包括用户名、终端、登录时间、来源IP等

使用场景:

  • 只需要知道谁在线时用 users
  • 需要了解登录详情(如从哪里登录、何时登录)时用 who

users 命令只显示当前登录的用户。要统计系统总用户数,需要使用其他命令:

# 统计系统所有用户
getent passwd | wc -l

# 统计可登录的用户(有shell的用户)
getent passwd | grep -E ":/bin/(bash|sh|zsh|tcsh)" | wc -l

# 查看所有用户列表
cut -d: -f1 /etc/passwd

相关命令

who

显示当前登录用户的详细信息

查看详情
w

显示用户信息和当前任务

查看详情
last

显示用户登录历史记录

查看详情