HOME

who命令在脚本中使用技巧

who 命令是 Linux 系统管理中的一个强大工具,它能够显示当前登录到系统的用户信息。当需要将这些信息嵌入脚本以实现自动化或监控目的时,掌握其用法和选项就显得尤为重要。

1. who 命令基础

who 命令默认会显示所有通过终端(TTY)登录的用户列表。输出通常包括用户名、主机名以及登录时间等信息。

$ who

示例输出:

USER     TTY      FROM            LOGIN@   IDLE   JCPU   PCPU WHAT
user1    pts/0    192.168.1.100    07:34am  5:47m  0.01s  0.01s /bin/bash

2. who 命令的选项

who 命令提供了多种选项,可用于获取特定类型的信息。

$ who -b

示例输出:

reboot   system boot  5.10.0-26-generic    Thu Sep 30 08:00:00 2021

3. who 命令在脚本中的使用

3.1 获取当前登录用户信息

可以将 who 的输出直接用于条件判断或日志记录。例如,编写一个简单脚本来检查是否有其他管理员登录:

#!/bin/bash

# 使用 who -q 检查系统最后一次启动时间
last_boot=$(who -b | awk '{print $5, $6}')

if [ $(who | grep 'admin' > /dev/null; echo $? ) -eq 0 ]; then
    echo "警告:用户 admin 已登录。上一次系统引导时间是 $last_boot"
else
    echo "当前没有 admin 用户登录,系统最后一次启动时间是 $last_boot"
fi

3.2 使用 who 过滤特定用户

有时候需要根据用户名过滤输出,例如监控是否有人在周末或非工作时段登录。可以使用 grep 或者 awk 来实现:

#!/bin/bash

# 获取所有用户并过滤出 admin 用户
admin_users=$(who | grep 'admin')

if [ -z "$admin_users" ]; then
    echo "没有发现任何 admin 用户登录"
else
    echo "以下 admin 用户已登录:$admin_users"
fi

3.3 结合 who 和其他命令

除了直接使用 who 命令外,还可以将其与 grep, awk, 或其他 Linux 命令结合使用以实现更复杂的逻辑:

#!/bin/bash

# 获取所有超过10分钟未响应的用户
inactive_users=$(who -q | awk '{print $5, $6}' | while read line; do 
    idle_time=$(echo $line | awk '{print $2}')
    if [ "$idle_time" -gt 10 ]; then
        echo $line
    fi
done)

if [ -z "$inactive_users" ]; then
    echo "所有用户都在活动状态"
else
    echo "以下用户的会话超时:$inactive_users"
fi

通过这些示例和技巧,你可以在脚本中有效地利用 who 命令来监控系统状态或执行特定任务。