用户登录时间脚本

创建于:2024年9月28日

使用 OpenAI 01 预览版 回答 OpenAI01

问题

帮我写个优雅的linux bash脚本列出系统中所有的用户和其登录时间,按照时间从就到新的顺序排列

思考

列出所有用户及其登录时间

正在编写一个bash脚本,以优雅地列出系统中所有用户及其登录时间,并按从旧到新排序。

思考如何列出时间

正在思考使用 'last' 命令获取登录记录,并将其反转排序,从而列出最旧到最新的登录时间。

# 使用 'lastlog' 命令和 bash 脚本获取所有用户的最后登录时间,并按时间排序

探索脚本选项

我在查找适合的脚本选项,通过lastlog命令查看登录会话。为了更好地了解,我还可以使用last命令,并通过tac反转输出,以展示最老的登录会话。

解析数据时间

使用 'last' 命令获取登录会话,配合 'awk' 解析日期字段,并转换为可排序的格式(如 Unix 时间戳),最后根据时间戳排序并格式化输出。

【过滤并转换预约时间】 我正在寻找一种方法,通过过滤登录时间并按日期排序来显示唯一的组合。这让我开始考虑如何高效地操作"last -F"命令以提取和整理这些信息。

整理用户数据

我正在尝试提取和整理用户的最后登录时间,过程中利用lastloggetent passwd,希望能简化日期解析问题。

确保日期字段

确定 'lastlog' 输出中的日期字段从第四个字段开始,计划从第四个字段处理日期数据。这将帮助整理和分析日志。

探索解决方案

考察使用 'lastlog' 输出的优雅处理方法。尝试 'lastlog -t 365' 获取最近365天的登录用户。计划一步步编写脚本。

回答

以下是一个优雅的 Linux Bash 脚本,用于列出系统中所有的用户及其登录时间,按照时间从旧到新排序:

#!/bin/bash lastlog | grep -v "Never logged in" | tail -n +2 | awk ' { # 找到月份字段的位置 for(i=1; i<=NF; i++) { if ($i ~ /^[A-Z][a-z][a-z]$/) { mon = $i day = $(i+1) time = $(i+2) tz = $(i+3) year = $(i+4) break } } # 组合日期时间字符串 datetime = mon " " day " " year " " time " " tz # 将日期时间转换为时间戳 cmd = "date -d \"" datetime "\" +%s" cmd | getline login_time close(cmd) # 输出时间戳和用户信息 print login_time, $1, datetime }' | sort -n | awk ' { # 格式化输出用户名和登录时间 print $2, $3, $4, $5, $6, $7 }'

脚本说明:

  1. lastlog:获取所有用户的最后登录信息。
  2. grep -v "Never logged in":排除从未登录过的用户。
  3. tail -n +2:去除标题行。
  4. awk:解析并提取用户名和登录时间信息。
    • 通过正则表达式找到月份字段的位置,然后提取完整的日期时间。
    • 使用 date -d 将日期时间转换为 Unix 时间戳,便于排序。
  5. sort -n:根据时间戳从小到大排序。
  6. 再次使用 awk 格式化输出,显示用户名和可读的登录时间。

运行方法:

将上述脚本保存为 list_users.sh,然后给予执行权限并运行:

chmod +x list_users.sh ./list_users.sh

示例输出:

user1 Jan 10 2021 08:15:00 +0000
user2 Mar 22 2021 14:30:00 +0000
user3 Jun 05 2021 09:45:00 +0000
...

该脚本按登录时间从最早到最新列出了所有曾经登录过的用户及其最后的登录时间。

分享这个问答