分析日志 /root/secure.zip ,编写脚本 /root/12.sh,如右图(注意对齐):

要实现分析 SSH 日志并按格式输出,我们可以编写 Shell 脚本,分步处理成功登录、暴力破解 IP Top10、暴力破解用户 Top10 三个部分。以下是完整脚本:

脚本代码(/root/12.sh)

#!/bin/bash

# 1. 分析 SSH 成功登录情况
echo "分析一个月 SSH 成功登录情况:"
echo
unzip -p /root/secure.zip | grep "Accepted " | awk '{
    # 提取时间(日志前3字段:月 日 时间)
    time_str = $1 " " $2 " " $3;
    # 提取用户名("for" 后第一个字段,如 $9)
    user = $9;
    # 提取IP("from" 后第一个字段,如 $11)
    ip = $11;
    # 格式化输出(IP左对齐15字符,用户左对齐8字符)
    printf "    IP: %-15s  用户: %-8s  %s 登录成功\n", ip, user, time_str;
}'

# 2. 分析暴力破解来源 IP Top10
echo
echo "分析一个月 SSH 暴力破解来源 IP Top10:"
echo
unzip -p /root/secure.zip | grep "Failed password" | awk '{
    # 遍历字段,找到 "from" 后提取IP
    for (i=1; i<=NF; i++) {
        if ($i == "from") {
            print $(i+1);
            break;
        }
    }
}' | sort | uniq -c | sort -nr | head -10 | awk '{
    # 格式化输出(IP左对齐15字符,次数右对齐)
    printf "    异常IP: %-15s 暴力破解 %d 次\n", $2, $1;
}'

# 3. 分析暴力破解用户 Top10
echo
echo "分析一个月 SSH 被暴力破解用户 Top10:"
echo
unzip -p /root/secure.zip | grep "Failed password" | awk '{
    # 遍历字段,找到 "for" 后提取用户(处理无效用户场景)
    for (i=1; i<=NF; i++) {
        if ($i == "for") {
            if ($(i+1) == "invalid") {
                user = $(i+2);  # 无效用户:"for invalid user xxx"
            } else {
                user = $(i+1);  # 有效用户:"for xxx"
            }
            print user;
            break;
        }
    }
}' | sort | uniq -c | sort -nr | head -10 | awk '{
    # 格式化输出(用户左对齐8字符,次数右对齐)
    printf "    用户: %-8s 暴力破解 %d 次\n", $2, $1;
}'

脚本说明

  1. 解压与过滤
    使用 unzip -p 直接读取压缩包内的日志(避免解压到磁盘),通过 grep 筛选关键行(Accepted 对应成功登录,Failed password 对应暴力破解)。

  2. 字段提取

    • 成功登录:通过 awk 提取时间(前3字段)、用户(for 后字段)、IP(from 后字段)。
    • 暴力破解 IP:遍历字段找到 from,提取后续 IP,统计次数并排序。
    • 暴力破解用户:遍历字段找到 for,区分“有效用户”和“无效用户”(如 invalid user 场景),提取用户名后统计排序。
  3. 格式化输出
    通过 printf 控制对齐(如 %-15s 左对齐15字符,%d 数字对齐),确保输出与示例格式一致。

使用方法

  1. 保存脚本:将上述代码保存为 /root/12.sh
  2. 赋予权限:chmod +x /root/12.sh
  3. 运行脚本:/root/12.sh,即可输出分析结果。
posted on 2025-08-07 17:07  爱尔奎特‘殷’  阅读(45)  评论(0)    收藏  举报