怎么用脚本获取上次登录信息

wen 实用脚本 2

本文目录导读:

怎么用脚本获取上次登录信息

  1. 📖 目录导读
  2. 为什么需要脚本获取登录历史?
  3. Windows 平台:PowerShell 与 CMD 脚本实战
  4. Linux/Unix 平台:Bash 脚本与日志解析
  5. macOS 特殊场景:last 与 log 命令整合
  6. 跨平台脚本技巧:Python 通用方案
  7. 常见问题与安全注意事项
  8. Q&A 问答精选

如何用脚本高效获取系统上次登录信息?多平台实战指南


📖 目录导读

  1. 为什么需要脚本获取登录历史?
  2. Windows 平台:PowerShell 与 CMD 脚本实战
  3. Linux/Unix 平台:Bash 脚本与日志解析
  4. macOS 特殊场景:last 与 log 命令整合
  5. 跨平台脚本技巧:Python 通用方案
  6. 常见问题与安全注意事项
  7. 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 sessionquery 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秒刷新。


本文基于多平台官方文档及社区实践整理,经过交叉验证确保准确性。 如果本文对您有帮助,欢迎收藏并转发给需要的朋友!

抱歉,评论功能暂时关闭!