find "${log_dir}" -type f -name "*.log" -mtime +${max_days} -delete
这是一个 shell 命令,它的作用是删除指定目录下的一定时间范围内的日志文件。其中,${log_dir}
是一个变量,它的值会在命令执行时被替换为实际的目录路径;${max_days}
是一个变量,它的值表示最大的保留天数。
命令的具体含义如下:
find "${log_dir}"
:在${log_dir}
目录下查找文件。-type f
:只查找普通文件,不包括目录和设备文件等。-name "*.log"
:文件名匹配*.log
的文件。-mtime +${max_days}
:最后修改时间在${max_days}
天之前的文件。-delete
:删除符合条件的文件。
执行该命令会删除 ${log_dir}
目录下最后修改时间在 ${max_days}
天之前的所有 .log
后缀的日志文件。
find "${log_dir}" -type f -name "*.log" -mtime +${max_days} -delete所以是可以删除-name选项吗?
不是的,-name "*.log"
选项是用来匹配文件名的,它表示只匹配文件名以 .log
结尾的文件。这个选项是非常必要的,因为在 ${log_dir}
目录下可能会有其他后缀名的文件,我们只想删除 .log
后缀的日志文件。
-mtime +${max_days}
选项是用来匹配文件修改时间的,它表示只匹配最后修改时间在 ${max_days}
天前的文件。这个选项也是必要的,因为我们只想删除七天前的日志文件,而不是所有日志文件。
因此,如果你删除了 -name
选项,脚本可能会误删一些其他后缀名的文件,而如果你删除了 -mtime
选项,脚本可能会删除所有日志文件,而不仅仅是七天前的。
忘记之前的对话,用linux编写一个通用的实时在后台监测防止ddos攻击脚本,直接给出完整的案例,无需解释,要求有白名单列表,多个白名单用逗号隔开,排除本地所有网卡ip,每20秒钟检测一次(shell变量配置),限制每个ip每秒钟和服务器建立的最大TCP连接数(shell变量配置),并增加日志记录功能,超过最大连接数则要记录时间、攻击者ip、访问端口、协议、携带报文、建立的tcp连接总数等信息保存到/home/ddos目录下(shell变量配置),每个日志文件最大100MB(shell变量配置,自动清理3天以前的日志),超过100MB则要重新生成新文件,以生成时间命名(精确到毫秒),并使用iptables立即封禁该ip(已经封禁过的无需再次封禁),保存到/home/ddos/blackIpList.txt(shell变量配置),以上代码中文件或者目录不存在的需要自动进行创建,灵活发挥,减少人工干预和出错概率
以下是一个使用 bash shell 编写的通用的实时在后台监测防止 DDOS 攻击的脚本的示例:
``` #!/bin/bash
定义变量
ip_list="/home/ddos/whiteIpList.txt" # 白名单列表 log_dir="/home/ddos" # 日志目录 log_file="$log_dir/ddos.log" # 日志文件 max_conn=100 # 每个 IP 每秒钟和服务器建立的最大 TCP 连接数 block_time=3600 # 封禁时间(单位:秒) log_size=100 # 日志文件大小(单位:MB) log_keep_days=3 # 保留日志文件的天数
创建目录和文件
[ ! -d "$log_dir" ] && mkdir -p "$log_dir" [ ! -f "$log_file" ] && touch "$log_file"
删除旧的日志文件
find "$log_dir" -mtime +$log_keep_days -type f -name "ddos*.log" -delete
清空日志文件
echo "" > "$log_file"
创建无限循环
while : do # 获取本地所有网卡的 IP 地址 local_ips=$(ifconfig | grep -Eo 'inet (addr:)?([0-9].){3}[0-9]' | grep -Eo '([0-9].){3}[0-9]')
# 获取连接数前 100 的 IP
top_ips=$(netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head -n 100)
# 遍历每个 IP
while read -r line; do
# 解析行内容
conn=$(echo "$line" | awk '{print $1}')
ip=$(echo "$line" | awk '{print $2}')
# 跳过白名单中的 IP
grep -q "$ip" "$ip_list" && continue
# 跳过本地所有网卡的 IP
echo "$local_ips" | grep -q "$ip" && continue
#
相关推荐




