安全运维 10个必备日志处理Shell脚本!

科技   2024-11-20 09:20   重庆  

在运维工作中,日志处理是一项至关重要的任务,用于监控系统状态、排查故障以及性能调优等。以下是10个Shell脚本示例,可以用于日志处理和分析,但需要根据实际环境进行调整。

1. 实时日志监控与报警脚本 (monitor_log_and_alert.sh)

功能:实时监控日志文件,当检测到特定错误关键字时发送报警邮件。

#!/bin/bash

LOG_FILE="/path/to/your/logfile.log"
KEYWORD="ERROR"
EMAIL="admin@example.com"

tail-F $LOG_FILE|whileread line;do
ifecho"$line"| grep -q "$KEYWORD";then
echo"Alert: $line"| mail -s "Error Detected in $LOG_FILE"$EMAIL
fi
done

2. 日志按时间分割脚本 (log_rotate.sh)

功能:模拟logrotate功能,每天将旧日志重命名并创建新日志。

#!/bin/bash

LOG_FILE="/path/to/your/logfile.log"
DATE=$(date+%Y%m%d)

# 检查是否存在昨天的日志文件
if[!-f "$LOG_FILE.$DATE"];then
# 重命名当前日志文件并创建新文件
mv"$LOG_FILE""$LOG_FILE.$DATE"
touch"$LOG_FILE"
echo"Rotated log file to $LOG_FILE.$DATE"
fi

3. 异常日志聚合分析脚本 (aggregate_errors.sh)

功能:从多个服务器的日志文件中收集错误日志,并聚合分析。

#!/bin/bash

SERVERS=("server1""server2""server3")
ERROR_DIR="/path/to/error_logs"
mkdir-p "$ERROR_DIR"

for SERVER in"${SERVERS[@]}";do
    SSH_CMD="ssh $SERVER 'cat /path/to/logs/error.log'"
    ERRORS=$(eval$SSH_CMD)
echo"$ERRORS"| grep 'ERROR'>>"$ERROR_DIR/${SERVER}_errors.log"
done

# 可选:进一步分析这些错误日志
# ...

4. 日志时间戳转换脚本 (timestamp_convert.sh)

功能:将日志文件中的时间戳从UNIX时间戳转换为可读的日期格式。

#!/bin/bash

LOG_FILE="/path/to/your/logfile_with_timestamps.log"
OUTPUT_FILE="/path/to/converted_log.log"

while IFS=read-r line;do
# 假设每行的第一个字段是UNIX时间戳
    TIMESTAMP=$(echo$line|cut-d' '-f1)
    MESSAGE=$(echo$line|cut-d' '-f2-)
    HUMAN_READABLE_DATE=$(date-d @"$TIMESTAMP"+"%Y-%m-%d %H:%M:%S")
echo"$HUMAN_READABLE_DATE $MESSAGE">>"$OUTPUT_FILE"
done"$LOG_FILE"

5. 日志IP地址统计脚本 (ip_address_statistics.sh)

功能:统计日志文件中访问者的IP地址及其出现次数,并排序输出。

#!/bin/bash

LOG_FILE="/path/to/your/access.log"

# 使用awk处理日志文件,统计每个IP地址的出现次数
awk '{print $1}' $LOG_FILE | sort | uniq -c | sort -nr

这个脚本假设日志文件的每行第一个字段是访问者的IP地址。awk命令用于提取每行的第一个字段(即IP地址),然后通过管道传递给sort进行排序,uniq -c用于统计每个IP地址的出现次数,最后再次使用sort -nr进行数值排序并逆序输出。

6. 日志请求类型分析脚本 (request_type_analysis.sh)

功能:分析日志文件中不同HTTP请求类型(如GET、POST)的比例。

#!/bin/bash

LOG_FILE="/path/to/your/access.log"

# 使用awk统计不同请求类型的数量
declare-A request_types
while IFS=read-r line;do
    method=$(echo$line| awk '{print $6}')# 假设请求方法在第六个字段
if[["${request_types[$method]}"]];then
((request_types[$method]++))
else
        request_types[$method]=1
fi
done<"$LOG_FILE"

# 输出统计结果
echo"Request Type Statistics:"
for method in"${!request_types[@]}";do
echo"$method${request_types[$method]}"
done

这个脚本使用关联数组request_types来统计不同HTTP请求类型的数量。它遍历日志文件,使用awk提取每行的请求方法,并根据请求类型更新关联数组中的计数。最后,脚本遍历关联数组并输出每个请求类型及其对应的数量。

7. 日志响应时间分析脚本 (response_time_analysis.sh)

功能:分析日志文件中每个请求的响应时间,并统计不同时间段的请求数量。

#!/bin/bash

LOG_FILE="/path/to/your/access.log"

# 假设日志中包含响应时间字段,并位于特定位置(例如第10个字段)
# 此脚本简单地将响应时间分为几个区间进行统计
declare-A response_times
bins=("0-100ms""101-200ms""201-500ms""501-1000ms""1000ms+")

while IFS=read-r line;do
    response_time=$(echo$line| awk '{print $10}')# 假设响应时间在第十个字段
if(( $(echo"$response_time <= 100"|bc -l)));then
        bin="0-100ms"
elif(( $(echo"$response_time <= 200"|bc -l)));then
        bin="101-200ms"
elif(( $(echo"$response_time <= 500"|bc -l)));then
        bin="201-500ms"
elif(( $(echo"$response_time <= 1000"|bc -l)));then
        bin="501-1000ms"
else
        bin="1000ms+"
fi
((response_times[$bin]++))
done<"$LOG_FILE"

echo"Response Time Statistics:"
for bin in"${!response_times[@]}";do
echo"$bin${response_times[$bin]}"
done

8. 日志文件内容差异分析脚本 (log_diff_analysis.sh)

功能:比较两个日志文件之间的差异,并输出不同之处。

#!/bin/bash

LOG_FILE1="/path/to/log1.log"
LOG_FILE2="/path/to/log2.log"

# 使用diff命令比较两个文件,并忽略空白行的差异
diff -B --side-by-side $LOG_FILE1 $LOG_FILE2

这个脚本使用diff命令来比较两个日志文件的内容。--side-by-side选项以并排的方式显示两个文件的差异,-B选项用于忽略行尾尾随的空白差异。

9. 日志中特定用户活动跟踪脚本 (user_activity_tracker.sh)

功能:从日志文件中提取特定用户的所有活动记录,并按时间排序。

#!/bin/bash

LOG_FILE="/path/to/user_activity.log"
USER_NAME="target_user"

# 假设日志中的每一行都包含用户名,并可能位于不同位置
# 使用awk查找包含特定用户名的行,并输出整行
awk -v user="$USER_NAME" '$0 ~ user {print}' $LOG_FILE | sort

这个脚本使用awk来搜索包含特定用户名的行,并通过管道传递给sort命令进行排序。注意,这个脚本假设用户名可能出现在日志行的任何位置,并且简单地匹配整行中是否包含该用户名。根据实际的日志格式,你可能需要调整awk的模式匹配逻辑。

10. 日志文件压缩与备份脚本 (log_compress_and_backup.sh)

功能:将日志文件压缩后备份到指定的远程服务器或本地目录。

#!/bin/bash

LOG_DIR="/path/to/logs"
BACKUP_DIR="/path/to/backup"
DATE=$(date+%Y%m%d)
BACKUP_FILE="logs_backup_$DATE.tar.gz"

# 压缩日志目录
tar -czvf $BACKUP_DIR/$BACKUP_FILE$LOG_DIR

# 可选:将备份文件复制到远程服务器(使用scp命令)
# scp $BACKUP_DIR/$BACKUP_FILE username@remotehost:/path/to/remote/backup/

echo "Backup completed: $BACKUP_DIR/$BACKUP_FILE"

这个脚本将指定的日志目录压缩成一个tar.gz文件,并保存到备份目录中。脚本还包含了一个可选的命令,用于将备份文件复制到远程服务器。你需要根据实际的远程服务器地址、用户名和路径来修改scp命令。

HACK之道
HACK之道,专注于红队攻防、实战技巧、CTF比赛、安全开发、安全运维、安全架构等精华技术文章及渗透教程、安全工具的分享。
 最新文章