脚本预期效果:
月初自动生成打流时间表,后台运行脚本匹配到时间表执行打流命令
变量预定义
[root@idc113-pc21 auto-attack]# cat parms.sh
logyear=$(date "+%Y")
logmonth=$(date "+%m")
logday=$(date "+%m%d")
logtime=$(date "+%H%M")
xhome=/mnt/boot/idc-xmit
maxice=$(cat /proc/ice_debug_info | grep ch | tail -n 1 | sed 's/.*ch\([0-9]*\):/\1/' | tr -d '\r') #定义ice驱动通道最大值
home=/mnt/boot/auto-attack
logdir=${home}/log
packet_dir=/mnt/boot/idc-xmit/cap #定义打流所用包目录
hosts=$(basename "$0" | awk -F "_" '{print $1}') #以文件前缀作为目录 文件名格式 地名_脚本名
ips=${home}/atkip/${hosts}ips.txt
timetable=${home}/log/timetable.log #定义时间表文件变化日志
MAX_SIZE=5368709120
logfile=$logdir/$hosts/$logyear/$logmonth/${hosts}_timeable.txt #定义时间表日志
attacklog=$logdir/$hosts/$logyear/$logmonth/${hosts}_attack.txt #定义打流表日志
SIM_CAP_MAC="68:05:ca:ab:02:64 28:53:4e:99:87:f1" #定义发包打流本地mac与互联mac
函数预定义
[root@idc113-pc21 auto-attack]# cat functions.sh
#取余生成随机数
function rand(){
min=$1
max=$(($2-$min+1))
num=$(date +%s%N)
echo $(($num%$max+$min))
}
# 获取当前时间信息
get_current_time() {
nowmin=$(date "+%-M")
nowhour=$(date "+%-H")
nowday=$(date "+%-d")
nowmonth=$(date "+%m")
nowyear=$(date "+%Y")
}
# 生成随机时间
function rand_time() {
min=$(rand 0 59)
hour=$(rand 0 23)
lastday=$(cal | xargs | awk '{print $NF}') #echo "lastday is $lastday"
day=$(rand 1 $lastday)
delay=$(rand 0 59)
echo "$hour $min $delay $day"
}
# 随机选取一个报文包文件
function rand_packet() {
files=$(ls $packet_dir/*.cap)
echo $(echo $files | tr " " "\n" | shuf -n 1)
}
# 随机生成持续时间
function rand_duration() {
echo $(rand 10 120)
}
# 随机生成流量大小
function rand_traffic_number1() {
echo $(rand 100 500)
}
function rand_traffic_number2() {
echo $(rand 500 1000)
}
function rand_traffic_number3() {
echo $(rand 1000 3000)
}
# 随机选取一个目标IP地址 以下函数只适用于IP掩码大于等于/24掩码
function rand_ip() {
line=$(shuf -n1 $ips)
#echo $line
ip=$(echo $line |awk -F "/" '{print $1}')&&eval ipdomain=${ip%.*}
ipstart=$(echo $line |awk -F "/" '{print $1}'|awk -F "." '{print $4}')
ipnum=$(echo $line |awk -F "/" '{print $2}')
ipend=256
for((j=24;j<$ipnum;j++)); do
ipend=$(($ipend/2))
done
ipend=$((($ipstart+$ipend-1)))
ipstart=$(test $ipstart -gt 1 && echo $ipstart || echo 1)
ipend=$(test $ipend -lt 254 && echo $ipend || echo 254)
iprandom=$(rand $ipstart $ipend)
dip="$ipdomain.$iprandom"
echo $dip
}
# 从路径中提取主机名
extract_hosts() {
path=$(echo "$0" | awk -F "_" '{print $1}')
eval hosts=${path##*/}
}
check_and_clear_timetable() {
if [ -f "$timetable" ]; then
file_size=$(stat -c%s "$timetable")
if [ "$file_size" -gt "$MAX_SIZE" ]; then
echo "$(date) 时间表文件大小超过5GB,清空内容..." >> "$timetable"
> "$timetable"
fi
fi
}
打流时间表生成脚本
[root@idc113-pc21 auto-attack]# cat taizhougf_timetable.sh
#!/bin/bash
# 加载变量和函数
source /mnt/boot/auto-attack/parms.sh
source /mnt/boot/auto-attack/functions.sh
# 创建必要的目录
mkdir -p "$logdir/$hosts/$logyear/$logmonth"
# 备份旧的日志文件,如果不存在则创建新的文件
if [[ -f "$logfile" ]]; then
cp "$logfile" "$logfile.bak"
else
touch "$logfile"
fi
# 检查输入参数 三个位置参数可以人为指定不同流量范围的打流条目数
number1=$1 # 100M~500M 范围的流量大小
number2=$2 # 500M~1000M 范围的流量大小
number3=$3 # 1000M~3000M 范围的流量大小
# 如果任意一个参数为空,则生成5-15之间的随机数作为默认值
if [[ -z $number1 || -z $number2 || -z $number3 ]]; then
echo "警告:缺少参数,使用随机数作为默认值。用法: $0 <number1> <number2> <number3>"
[[ -z $number1 ]] && number1=$(rand 5 15)
[[ -z $number2 ]] && number2=$(rand 5 15)
[[ -z $number3 ]] && number3=$(rand 5 15)
fi
# 生成指定数量的行数据
function gen_data() {
count=$(( $1 + $2 + $3 ))
for ((i=0; i<$count; i++))
do
# 随机生成100M~500M打流参数
if [ $i -lt $1 ]; then
t=$(rand_time)
p=$(rand_packet)
d=$(rand_duration)
s=$(rand_traffic_number1)
dip=$(rand_ip)
echo "$t $p $s $d $dip"
# 随机生成500M~1000M打流参数
elif [ $i -lt $(($1 + $2)) ]; then
t=$(rand_time)
p=$(rand_packet)
d=$(rand_duration)
s=$(rand_traffic_number2)
dip=$(rand_ip)
echo "$t $p $s $d $dip"
# 随机生成1000M~3000M打流参数
else
t=$(rand_time)
p=$(rand_packet)
d=$(rand_duration)
s=$(rand_traffic_number3)
dip=$(rand_ip)
echo "$t $p $s $d $dip"
fi
done
}
# 调用生成数据的函数,并将结果按照day、hour、min、delay排序后写入时间表日志文件
gen_data "$number1" "$number2" "$number3" | sort -n -k 4 -k 1 -k 2 -k 3 > "$logfile"
# 记录成功生成日志
echo "$(date) Streaming schedule generated successfully" >> "$timetable"
打流时间检查脚本
[root@idc113-pc21 auto-attack]# cat taizhougf_checktime.sh
#!/bin/bash
# 导入外部文件
source /mnt/boot/auto-attack/parms.sh
source /mnt/boot/auto-attack/functions.sh
# 读取并处理每一行
process_line() {
local line="$1"
# 跳过以 "#" 开头的行
if [[ $line =~ ^# ]]; then
echo "skip"
return
fi
# 使用 read 命令来简化字段提取
read -r hour min delay day atktype atkmax atktime atkip <<<"$line"
# 生成随机通道编号
atkice=$(rand 4 "$maxice")
# 检查当前时间是否符合条件
if [[ "$nowday" -eq "$day" && "$nowhour" -eq "$hour" && "$nowmin" -eq "$min" ]]; then
echo "checkok"
sleep "$delay"
echo "startattack"
time=$(date +%Y-%m-%d' '%H:%M:%S.%N | cut -b 1-23)
echo "$time"
${xhome}/xmit_ioctl $atktype $atkmax $atktime $atkice $atkip $SIM_CAP_MAC 0 -s ${xhome}/idc-xmit/idc_ip_demo.txt
# 获取发包命令的状态码
status=$?
if [ "$status" -eq 0 ]; then
echo "发包命令成功执行,状态码: $status" >> "$timetable"
else
echo "发包命令执行失败,状态码: $status" >> "$timetable"
fi
# 将处理过的行标记为注释
sed -i "s@$line@#&@g" "$logfile"
echo "$line" >> "$attacklog"
else
echo "checkerr"
fi
}
# 主函数
main() {
while true; do
get_current_time
echo "nowmin is $nowmin"
echo "nowhour is $nowhour"
echo "nowday is $nowday"
echo -e "*********\n"
# 使用 while 循环读取文件
while IFS= read -r line; do
echo "$line"
process_line "$line"
echo -e "#########\n"
done < "$logfile"
# 每秒钟检查一次
sleep 1
done
}
# 执行主函数
main
打流主脚本
#!/bin/bash
# 定义变量及函数
source /mnt/boot/auto-attack/parms.sh
source /mnt/boot/auto-attack/functions.sh
# 定义脚本路径
TIMETABLE_SCRIPT="${home}/taizhougf_timetable.sh"
CHECKTIME_SCRIPT="${home}/taizhougf_checktime.sh"
CHECKTIME_SCRIPT_NAME=$(basename "$CHECKTIME_SCRIPT")
# 每月1日00:00执行taizhougf_timetable.sh生成taizhougf_timeable.txt
generate_timetable() {
$TIMETABLE_SCRIPT # 这里的位置参数可以根据你的实际情况调整
}
# 启动时间检查脚本(如果它没有运行)
start_checktime_if_not_running() {
if ! pgrep -f "$CHECKTIME_SCRIPT_NAME" > /dev/null 2>&1; then
echo "$(date) 时间检查脚本未运行,正在启动..." >> "$timetable"
nohup $CHECKTIME_SCRIPT >> "${logdir}/checktime.log" 2>&1 &
echo "时间检查脚本已在后台运行。"
else
echo "$(date) 时间检查脚本已经在运行" >> "$timetable"
fi
}
# 主函数
main() {
# 检查当前时间是否为每月1日00:00
current_day=$(date +%d)
current_hour=$(date +%H)
current_minute=$(date +%M)
if [[ "$current_day" = "01" && "$current_hour" = "00" && "$current_minute" = "00" ]]; then
generate_timetable
echo "$(logmonth)时间表已生成 " >> "$timetable"
check_and_clear_timetable
fi
# 启动时间检查脚本(如果它没有运行)
start_checktime_if_not_running
}
main
#主脚本写入循环计划每分钟调用一次保证脚本稳定性
[root@idc113-pc21 system]# cat crond.sh
/mnt/boot/auto-attack/taizhougf_attack.sh
[root@idc113-pc21 system]# crontab -l
* * * * * /dev/shm/system/crond.sh >> /dev/shm/.timer.log