用于检查 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
Post Views: 36