Shell实现自动打流脚本

脚本预期效果:

月初自动生成打流时间表,后台运行脚本匹配到时间表执行打流命令

变量预定义

[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

测试结果

1.1checktime.log生成成功

1.2 timetable.log生成成功

1.3 taizhougf_timeable.txt生成成功

1.4 攻击流量图证明脚本完成

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值