分析日志 /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;
}'
脚本说明
-
解压与过滤:
使用unzip -p直接读取压缩包内的日志(避免解压到磁盘),通过grep筛选关键行(Accepted对应成功登录,Failed password对应暴力破解)。 -
字段提取:
- 成功登录:通过
awk提取时间(前3字段)、用户(for后字段)、IP(from后字段)。 - 暴力破解 IP:遍历字段找到
from,提取后续 IP,统计次数并排序。 - 暴力破解用户:遍历字段找到
for,区分“有效用户”和“无效用户”(如invalid user场景),提取用户名后统计排序。
- 成功登录:通过
-
格式化输出:
通过printf控制对齐(如%-15s左对齐15字符,%d数字对齐),确保输出与示例格式一致。
使用方法
- 保存脚本:将上述代码保存为
/root/12.sh。 - 赋予权限:
chmod +x /root/12.sh。 - 运行脚本:
/root/12.sh,即可输出分析结果。
浙公网安备 33010602011771号