编辑
2025-04-18
技术
00
请注意,本文编写于 303 天前,最后修改于 303 天前,其中某些信息可能已经过时。

参考Mhyidc的/60脚本进行修改

shell
#!/bin/bash ping_ipv6() { local src_ip=$1 local target_ipv6=$2 local temp_file=$3 local ping_output=$(ping6 -I $src_ip -i 0.3 -c 30 $target_ipv6 2>&1) ip addr del $src_ip/80 dev $interface_name local loss=$(echo "$ping_output" | grep 'packets transmitted' | awk '{print $6}') if [ "$loss" == "100%" ]; then return fi local min=$(echo "$ping_output" | grep 'rtt min/avg/max/mdev' | cut -d'=' -f2 | awk -F'/' '{print $2}') echo "$src_ip $min" >> "$temp_file" } cleanup() { for src_ip in "${ip_array[@]}"; do sudo ip addr del "$src_ip"/80 dev $interface_name 2>/dev/null done [ -f "$temp_file" ] && rm "$temp_file" [ -f "$temp_progress_file" ] && rm "$temp_progress_file" } print_progress_bar() { local -i current=$1 local -i total=$2 local filled=$((current*60/total)) local bars=$(printf "%-${filled}s" "|" | tr ' ' '|') local spaces=$(printf "%-$((60-filled))s" " ") local percent=$((current*100/total)) echo -ne "[${bars}${spaces}] ${percent}% ($current/$total)\r" } start_time=$(date +%s) trap cleanup EXIT interface_name=$(ip -6 route | grep default | grep -Po '(?<=dev )(\S+)' | head -1) current_ipv6=$(ip -6 addr show $interface_name | grep 'inet6' | grep -v 'fe80' | awk '{print $2}' | cut -d'/' -f1 | head -n 1) current_prefix=$(echo $current_ipv6 | cut -d':' -f1-5) echo "" echo "网卡当前配置的IPv6: $current_ipv6" echo "分配该虚拟机的IPv6: $current_prefix::/80" echo "" stty erase '^H' && read -p "请输入你要检测的对端IPv6: " target_ipv6 if ! [[ "$target_ipv6" =~ ^([0-9a-fA-F:]+)$ && "${#target_ipv6}" -ge 15 && "${#target_ipv6}" -le 39 ]]; then echo "你输入的这个地址看着不太对哇!" exit 1 fi stty erase '^H' && read -p "请输入你要测试多少个IPv6(建议512M机型小于500个): " ipv6_num if ! [[ "$ipv6_num" =~ ^[0-9]+$ ]]; then echo "写的啥玩意?认真点!" exit 1 fi if [ "$ipv6_num" == 0 ]; then echo "你看看你输的数量对吗?" exit 1 fi if echo "$ipv6_num 18446744073709551615" | awk '{exit !($1>$2)}'; then echo "$ipv6_num个?你的小鸡要冒烟咯!" exit 1 fi declare -a ip_array echo "" echo "在 $current_prefix::/80 中生成$ipv6_num个IPv6进行检测 请等待任务完成" declare -a ipv6_array=() declare -A used_ip_addrs used_ip_addrs[$current_ipv6]=1 current_count=0 for (( i=0; i<$ipv6_num; i++ )); do while : ; do random_part=$(printf '%x:%x:%x' $((RANDOM%65536)) $((RANDOM%65536)) $((RANDOM%65536))) test_ipv6="$current_prefix:$random_part" if [ -z ${used_ip_addrs[$test_ipv6]} ]; then sudo ip addr add "$test_ipv6"/80 dev $interface_name 2>/dev/null used_ip_addrs[$test_ipv6]=1 ip_array+=($test_ipv6) ((current_count++)) print_progress_bar $current_count $ipv6_num break else echo "IPv6地址 $test_ipv6 已存在,正在重新生成..." fi done done sleep 5s temp_file=$(mktemp) declare -A ipv6_rtt_results # 动态并发 total_jobs=${#ip_array[@]} quarter_jobs=$((total_jobs / 4)) if [ "$quarter_jobs" -gt 200 ]; then parallel_jobs=200 else parallel_jobs=$quarter_jobs fi completed_jobs=0 temp_progress_file=$(mktemp) echo echo "对$total_jobs个IPv6进行Ping测试中 请等待任务完成" print_progress_bar $completed_jobs $total_jobs { for src_ip in "${ip_array[@]}"; do ( ping_ipv6 "$src_ip" "$target_ipv6" "$temp_file" sudo ip addr del "$src_ip"/80 dev $interface_name 2>/dev/null echo >> "$temp_progress_file" ) & if (( $(jobs | wc -l) >= parallel_jobs )); then wait -n completed_jobs=$(wc -l < "$temp_progress_file") percent=$((completed_jobs * 100 / total_jobs)) print_progress_bar $completed_jobs $total_jobs fi done wait } while [ "$(wc -l < "$temp_progress_file")" -lt "$total_jobs" ]; do sleep 1 completed_jobs=$(wc -l < "$temp_progress_file") print_progress_bar $completed_jobs $total_jobs done completed_jobs=$(wc -l < "$temp_progress_file") print_progress_bar $completed_jobs $total_jobs wait echo "" echo "=====================================================" echo "IPv6 Average" sort -k2 -n "$temp_file" | head -n 10 | while read -r line; do ipv6=$(echo "$line" | awk '{print $1}') rtt=$(echo "$line" | awk '{print $2}') printf "%-40s %s ms\n" "$ipv6" "$rtt" done echo "=====================================================" end_time=$(date +%s) elapsed_time=$((end_time - start_time)) echo "脚本总耗时: $elapsed_time 秒。" echo "Power by PoloCloud@Wang_Boluo Mod by @KorenKrita" #给个面子别删吧哥

本文作者:ivan

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!