login_check

login_check

用于检查 CentOS 7 系统中今日通过 SSH 成功登录的用户和来源 IP 地址的 Shell 脚本

筛选今日成功登录记录

从 /var/log/secure 日志中提取今天所有 Accepted(成功登录)的 SSH 记录。
准确解析用户和IP

使用正则表达式匹配日志中的 for 用户名 from IP 模式,避免因字段位置变化导致解析错误。
结构化输出信息
列出每次成功登录的时间、用户名和客户端IP
汇总唯一的访问IP地址
汇总唯一登录的用户名
显示失败登录的IP及尝试次数(带统计)
增强容错能力

对格式异常的日志行会提示“解析失败”,便于排查问题。
#!/bin/bash
# ssh-access-today.sh - 改进版

LOG_FILE="/var/log/secure"
TODAY=$(date +%b" "%d)  # 注意:日期格式如 "Aug 14"

echo "=== 今天SSH访问记录 ==="
echo "时间: $(date)"
echo "日志文件: $LOG_FILE"
echo "过滤日期: $TODAY"

# 提取成功登录的记录(更精确的模式匹配)
echo -e "\n--- 成功登录 ---"
grep "Accepted" "$LOG_FILE" | grep "$TODAY" | while read line; do
    # 使用正则提取时间、用户名、IP
    if [[ $line =~ ([A-Za-z]{3}[[:space:]]+[0-9]{1,2}[[:space:]]+[0-9:]{8})?.*Accepted.*for[[:space:]]+([^[:space:]]+).*from[[:space:]]+([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+) ]]; then
        timestamp="${BASH_REMATCH[1]:-未知时间}"
        user="${BASH_REMATCH[2]}"
        ip="${BASH_REMATCH[3]}"
        echo "$timestamp - 用户: $user, IP: $ip"
    else
        # 如果正则不匹配,打印原始行用于调试
        echo "解析失败: $line"
    fi
done

echo -e "\n--- 唯一访问IP ---"
grep "Accepted" "$LOG_FILE" | grep "$TODAY" | \
    grep -oE 'from [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | \
    cut -d' ' -f2 | sort | uniq

echo -e "\n--- 唯一登录用户 ---"
grep "Accepted" "$LOG_FILE" | grep "$TODAY" | \
    grep -oE 'for [^[:space:]]+ from' | \
    cut -d' ' -f2 | sort | uniq

echo -e "\n--- 失败尝试 ---"
grep "Failed" "$LOG_FILE" | grep "$TODAY" | \
    grep -oE 'from [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | \
    cut -d' ' -f2 | sort | uniq -c | sort -nr
Avatar photo
igoZhang

互联网应用,虚拟化,容器

评论已关闭。