本文目录导读:

- 📖 目录导读
- 为什么需要脚本获取登录历史?
- Windows 平台:PowerShell 与 CMD 脚本实战
- Linux/Unix 平台:Bash 脚本与日志解析
- macOS 特殊场景:last 与 log 命令整合
- 跨平台脚本技巧:Python 通用方案
- 常见问题与安全注意事项
- Q&A 问答精选
如何用脚本高效获取系统上次登录信息?多平台实战指南
📖 目录导读
- 为什么需要脚本获取登录历史?
- Windows 平台:PowerShell 与 CMD 脚本实战
- Linux/Unix 平台:Bash 脚本与日志解析
- macOS 特殊场景:last 与 log 命令整合
- 跨平台脚本技巧:Python 通用方案
- 常见问题与安全注意事项
- Q&A 问答精选
为什么需要脚本获取登录历史?
在日常运维、安全审计或个人追踪中,获取上次登录信息 是排查异常访问、统计用户活跃度、检测未授权登录的关键步骤,手动查看系统日志虽可行,但效率低下且易遗漏,通过编写脚本,可以:
- 自动化提取:定时抓取并输出最近一次登录的用户名、时间、IP地址。
- 合并多源数据:同时分析本地登录、SSH远程、GUI登录等不同渠道。
- 告警集成:当发现异常登录(如深夜登录、陌生IP)时自动触发通知。
Windows 平台:PowerShell 与 CMD 脚本实战
1 使用 PowerShell 获取上次登录信息(推荐)
PowerShell 可以直接读取安全日志 Security(需管理员权限),过滤事件ID 4624(登录成功)。
脚本代码:
# 获取最后10条成功登录事件,提取用户名、时间、登录类型
Get-WinEvent -LogName Security -MaxEvents 10 | Where-Object { $_.Id -eq 4624 } |
Select-Object @{n='User';e={$_.Properties[5].Value}},
@{n='Time';e={$_.TimeCreated}},
@{n='LogonType';e={$_.Properties[8].Value}} |
Format-Table -AutoSize
- LogonType 含义:2=交互登录(本地),10=远程桌面,7=解锁屏幕。
- 注意事项:如果日志被清理或未开启审计策略,可能无结果,需先运行
secpol.msc启用“审核登录事件”。
2 传统 CMD 脚本(兼容旧系统)
使用 net session 或 query user 命令:
@echo off echo 当前登录用户信息: query user echo. echo 历史登录记录(需启用NetLogon日志): net statistics workstation | findstr /i "上一次"
局限:CMD 无法直接读取历史登录,仅显示当前会话,更可靠方案还是 PowerShell。
Linux/Unix 平台:Bash 脚本与日志解析
1 标准 last 命令
last 命令读取 /var/log/wtmp 文件,显示所有登录历史,包括重启记录。
核心脚本:
#!/bin/bash # 获取最近一次登录成功记录 last -1 -i | head -n 1 # 获取指定用户的最近登录时间 last -1 -i username
-i显示IP地址;-R不显示主机名。- 若只关心当前用户上次登录,可使用
last $USER。
2 从 secure 日志提取(精准匹配SSH)
对于 SSH 登录,/var/log/secure(CentOS/RedHat)或 /var/log/auth.log(Debian/Ubuntu)包含更详细信息。
# 提取最后一条 Accepted password 记录
grep "Accepted password" /var/log/auth.log | tail -n 1 | awk '{print $1,$2,$3,$9,$11}'
输出示例:Apr 10 14:32:21 root 192.168.1.100
3 综合脚本:输出最近10条登录
#!/bin/bash echo "=== 系统登录历史(最近10条)===" last -10 -i echo "" echo "=== 最新一条详细记录 ===" last -1 -i | grep -v "^$" | head -1
macOS 特殊场景:last 与 log 命令整合
macOS 基于 Darwin,保留了 last 命令,但日志系统已迁移到 log 命令,推荐混用:
脚本方案:
#!/bin/zsh # 获取上次登录(终端登录) echo "终端登录历史:" last -1 -i # 获取图形界面登录(如屏幕解锁) echo "GUI登录记录:" log show --predicate 'eventMessage contains "Login window"' --last 1d | tail -5
log show需要管理员权限才能读取安全事件。- 对于 macOS Ventura+,可通过
sudo log collect导出日志后再解析。
跨平台脚本技巧:Python 通用方案
如果需要一套脚本同时运行在 Windows、Linux、macOS 上,Python 是理想选择,利用 platform 模块判断系统后调用对应命令。
Python 3 脚本示例:
import platform
import subprocess
import re
def get_last_login():
os_name = platform.system()
if os_name == "Windows":
# 调用PowerShell脚本
cmd = "powershell -Command \"Get-WinEvent -LogName Security -MaxEvents 1 | Where-Object {$_.Id -eq 4624} | Select-Object TimeCreated, @{n='User';e={$_.Properties[5].Value}}\""
result = subprocess.run(cmd, capture_output=True, text=True, shell=True)
print(result.stdout.strip())
elif os_name == "Linux":
result = subprocess.run(["last", "-1", "-i"], capture_output=True, text=True)
print(result.stdout.strip())
elif os_name == "Darwin": # macOS
result = subprocess.run(["last", "-1", "-i"], capture_output=True, text=True)
print(result.stdout.strip())
if __name__ == "__main__":
get_last_login()
注意:Windows 上需以管理员身份运行脚本,否则PowerShell无法读取安全日志。
常见问题与安全注意事项
| 问题 | 解决方案 |
|---|---|
| 脚本返回“无权限” | 在 Windows 以管理员身份运行;Linux/macOS 加 sudo |
| 日志被清空 | 检查日志循环策略,调整 /etc/logrotate.conf 或 Windows 事件日志大小 |
| 获取的IP是127.0.0.1 | 说明是本地登录,远程登录会显示真实IP |
| 用户登录类型显示为空 | 部分旧系统日志格式不同,需调整属性索引 |
安全提醒:
- 脚本中避免明文存储密码或密钥。
- 将输出结果重定向到加密文件或发送给安全审计系统而非公开日志。
- 定期检查脚本本身的完整性,防止被篡改。
Q&A 问答精选
Q1:脚本能否获取“上次登录”和“上次退出”时间?
A:可以,在 Linux 使用 last -x 会显示关机/重启时间;Windows 中可用事件ID 4634(注销)与 4624 对比。
Q2:如何只获取当前用户的上次登录?
A:Linux 执行 last $USER;Windows 使用 powershell "$env:USERNAME" 动态传入用户名。
Q3:脚本返回的时间是UTC吗?如何转换为本地时间?
A:Linux last 默认使用系统时区;PowerShell 返回的是本地时间,若需转换UTC,可使用 date -d @timestamp 或在Python中使用 datetime 库。
Q4:服务器每天有几万次登录,脚本执行慢怎么办?
A:建议限制事件数量(如 -MaxEvents 5),或使用 Get-WinEvent -FilterHashtable (Windows) / grep 配合 tail(Linux)只读取最后几行。
Q5:脚本能否实时监控新登录?
A:可以,结合 watch 命令(Linux)或 Register-ObjectEvent(PowerShell)实现监听。watch -n 5 'last -1 -i' 每5秒刷新。
本文基于多平台官方文档及社区实践整理,经过交叉验证确保准确性。 如果本文对您有帮助,欢迎收藏并转发给需要的朋友!