写一个测试代理速度的脚本【编写手记】

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
ghostry
帖子: 1532
注册时间: 2008-07-23 20:08
来自: http://www.ghostry.cn
联系:

写一个测试代理速度的脚本【编写手记】

#1

帖子 ghostry » 2010-08-05 16:59

d.txt
(2.41 KiB) 已下载 66 次
代理列表如此

下边开始写程序文件名sudubest

代码: 全选

#! /bin/bash
##从IP地址列表里测得最快的地址
kkk=`cat $1 `
jjj=($kkk)
echo 总共${#jjj[@]}条记录
tk=1
for i in ${jjj[@]}; do
kkk=`echo $i|awk -F"[:]" '{print $1}'`
tttt="$tttt $i,0`ping $kkk -c 1 -w 1 |grep time=|awk -F"[=]" '{print $4}'|awk -F"[ ]" '{print $1}'`"
#echo $tttt
echo -e "$tk.\c:"
let tk=$tk+1
done
echo .
ttt=($tttt)
ksksk=1000
for i in ${ttt[@]}; do
ii=`echo $i|awk -F"[,]" '{print $2}'`
if [ $ii ]
then
    if [ `expr $ii \< $ksksk` ]
    then
    ksksk=$i
    fi
fi
done
echo $ksksk
上次由 ghostry 在 2010-08-05 17:06,总共编辑 1 次。
http://www.ghostry.cn狂网技术工作室,组网建站,平面设计,java项目,空间域名.
好心人点这里进去注册并且用一次,给我增加点流量http://tinyurl.com/272ncjl
电脑配置:
公司:880G/II250/1TB/2G1333/
家:785G+/II245+/1TB/2G677/
头像
ghostry
帖子: 1532
注册时间: 2008-07-23 20:08
来自: http://www.ghostry.cn
联系:

Re: 写一个测试代理速度的脚本

#2

帖子 ghostry » 2010-08-05 17:05

再写一个列出所有记录和ping值的

代码: 全选

#! /bin/bash
##从IP地址列表里测得最快的地址
kkk=`cat $1 `
jjj=($kkk)
echo 总共${#jjj[@]}条记录
tk=1
for i in ${jjj[@]}; do
kkk=`echo $i|awk -F"[:]" '{print $1}'`
tttt="$i , `ping $kkk -c 1 -w 1 |grep time=|awk -F"[=]" '{print $4}'|awk -F"[ ]" '{print $1}'`"
echo $tttt >> jxgo.csv
echo -e "$tk.\c:"
let tk=$tk+1
done
http://www.ghostry.cn狂网技术工作室,组网建站,平面设计,java项目,空间域名.
好心人点这里进去注册并且用一次,给我增加点流量http://tinyurl.com/272ncjl
电脑配置:
公司:880G/II250/1TB/2G1333/
家:785G+/II245+/1TB/2G677/
头像
numbchild
帖子: 107
注册时间: 2010-03-16 12:34

Re: 写一个测试代理速度的脚本

#3

帖子 numbchild » 2010-08-05 17:06

好厉害。。。拷贝了,,,, :em11
头像
ghostry
帖子: 1532
注册时间: 2008-07-23 20:08
来自: http://www.ghostry.cn
联系:

Re: 写一个测试代理速度的脚本【编写手记】

#4

帖子 ghostry » 2010-08-05 17:10

后来发现ping值和代理速度不是绝对关系。。
于是写了这个

代码: 全选

#! /bin/bash
##从IP地址列表里测得最快的地址
kkk=`cat $1 `
jjj=($kkk)
echo 总共${#jjj[@]}条记录
tk=1
for i in ${jjj[@]}; do
kkk=`echo $i|awk -F"[:]" '{print $1}'`
ktk="0`ping $kkk -c 1 -w 1 |grep time=|awk -F"[=]" '{print $4}'|awk -F"[ ]" '{print $1}'`"
if [ ! $ktk = "0" ]
then
    wget -e "http_proxy=http://$i/" "http://ppa.launchpad.net" --delete-after -o d.txt #这里的http://ppa.launchpad.net写成你希望代理过去的网址
    tttt="$tttt $i,`cat d.txt|grep "(*KB/s)"|awk '{ gsub(/\(/, " "); print }'|awk -F"[ ]" '{print $4}'`"
    #echo $tttt
fi
echo -e "$tk.\c:"
let tk=$tk+1
done
echo .
ttt=($tttt)
ksksk=0
for i in ${ttt[@]}; do
ii=`echo $i|awk -F"[,]" '{print $2}'`
if [ $ii ]
then
    if [ `expr $ii \> $ksksk` ]
    then
    ksksk=$i
    fi
fi
done
echo $ksksk
rm d.txt
这回应该可以代表代理过去的速度了。但是测试过程实在太慢。。特别是我那个200个地址的列表,实在等不了。。想来wget那里写的下载的文件大小很重要。太小测速不准,太大就太慢了。
http://www.ghostry.cn狂网技术工作室,组网建站,平面设计,java项目,空间域名.
好心人点这里进去注册并且用一次,给我增加点流量http://tinyurl.com/272ncjl
电脑配置:
公司:880G/II250/1TB/2G1333/
家:785G+/II245+/1TB/2G677/
头像
ghostry
帖子: 1532
注册时间: 2008-07-23 20:08
来自: http://www.ghostry.cn
联系:

Re: 写一个测试代理速度的脚本【编写手记】

#5

帖子 ghostry » 2010-08-05 17:25

又改进了一下,主要是限制了wget的重试次数为1,下载的文件也找了个小的。

代码: 全选

#! /bin/bash
##从IP地址列表里测得最快的地址
kkk=`cat $1 `
jjj=($kkk)
echo 总共${#jjj[@]}条记录
tk=1
for i in ${jjj[@]}; do
kkk=`echo $i|awk -F"[:]" '{print $1}'`
ktk="0`ping $kkk -c 1 -w 1 |grep time=|awk -F"[=]" '{print $4}'|awk -F"[ ]" '{print $1}'`"
if [ ! $ktk = "0" ]
then
    wget -e "http_proxy=http://$i/" "http://ppa.launchpad.net/wine-cn/ppa/ubuntu/dists/lucid/Release" --delete-after -t 1 -o d.txt
    tttt="$tttt $i,`cat d.txt|grep "(*KB/s)"|awk '{ gsub(/\(/, " "); print }'|awk -F"[ ]" '{print $4}'`"
    #echo $tttt
fi
echo -e "$tk.\c:"
let tk=$tk+1
done
echo .
ttt=($tttt)
ksksk=0
for i in ${ttt[@]}; do
ii=`echo $i|awk -F"[,]" '{print $2}'`
if [ $ii ]
then
    if [ `expr $ii \> $ksksk` ]
    then
    ksksk=$i
    fi
fi
done
echo $ksksk
rm d.txt
http://www.ghostry.cn狂网技术工作室,组网建站,平面设计,java项目,空间域名.
好心人点这里进去注册并且用一次,给我增加点流量http://tinyurl.com/272ncjl
电脑配置:
公司:880G/II250/1TB/2G1333/
家:785G+/II245+/1TB/2G677/
tusooa
帖子: 6548
注册时间: 2008-10-31 22:12
系统: 践兔
联系:

Re: 写一个测试代理速度的脚本【编写手记】

#6

帖子 tusooa » 2010-08-13 0:36

脚本没试。不过变量名太bt,实在口口。
变量名字都没意义的,不好维护。
为什么要下载到d.txt,/tmp不是很好的存放点吗?

代码: 全选

] ls -ld //
头像
ghostry
帖子: 1532
注册时间: 2008-07-23 20:08
来自: http://www.ghostry.cn
联系:

Re: 写一个测试代理速度的脚本【编写手记】

#7

帖子 ghostry » 2010-08-13 9:07

:em06 高手见笑了。。
我是业余的,不专业。。
http://www.ghostry.cn狂网技术工作室,组网建站,平面设计,java项目,空间域名.
好心人点这里进去注册并且用一次,给我增加点流量http://tinyurl.com/272ncjl
电脑配置:
公司:880G/II250/1TB/2G1333/
家:785G+/II245+/1TB/2G677/
头像
lainme
论坛版主
帖子: 7805
注册时间: 2008-09-13 19:17
系统: Arch Linux (x86_64)
联系:

Re: 写一个测试代理速度的脚本【编写手记】

#8

帖子 lainme » 2010-08-19 12:50

好工具。变量名……确实BT得可以。

我拿去改改……
头像
lainme
论坛版主
帖子: 7805
注册时间: 2008-09-13 19:17
系统: Arch Linux (x86_64)
联系:

Re: 写一个测试代理速度的脚本【编写手记】

#9

帖子 lainme » 2010-08-24 11:43

改了下,之前不想弄那么多文件所以用了秒数,后来觉得还是直接写速度好。改了下输出格式。proxycn部分,之前不能解析出域名形式的,现在修改了。

三种指定代理的方式,可以结合使用。

1)直接在命令行指定:proxy_test 127.0.0.1:80/127.0.0.1:808
2)输入文件:proxy_test -f filename
3)自动获取proxycn上的最新代理:proxy_test -w

可以指定用来测试的地址:proxy_test -t http://forum.ubuntu.org.cn

输入文件格式:

代码: 全选

127.0.0.1:80
127.0.0.1:808
获取帮助:不加参数或者proxy_test -h

脚本:

代码: 全选

#! /bin/bash
help() {
    echo -e "\
    用法:proxy_test 代理地址 [选项]
    设置代理地址
        proxy_test 127.0.0.1:80/127.0.0.1:808
    选项
        -f 文件名\t指定代理列表文件
        -w \t\t测试proxycn上的最新代理
        -t 网址\t\t用来测试的网址
        -h \t\t显示这个帮助"
}
parse_proxycn() {
    wget -q -O $weblist $weburl
    iconv -f gb18030 -t utf8 $weblist -o $weblist.utf8
    proxy_array=(${proxy_array[*]} $(
    sed -n '
    /更新日期/{
    s/[^<]*//
    s/<[^>]*>//g
    s/&nbsp;/\n/g
    s/\n//
    s/[0-9]*\n\([^.\n ]*\.\)/\1/g
    s/\n[^0-9][^\n]*//g
    s/\([0-9]*\.[^\n]*\)\n/\1:/g
    p
    }
    ' $weblist.utf8 ))
}
speedtest() {
    echo "总共 ${#proxy_array[*]} 个代理,开始速度测试..."
    rm -rf $tempout 
    i=1
    echo -e "编号\t代理地址\t\t\t速度(KB/s)"
    for proxy in ${proxy_array[*]};do
        export http_proxy=http://$proxy
        wget --dns-timeout=10 --connect-timeout=8 --read-timeout=15 -t 1 -o $logfile $testurl -O $tmpfile 
        speed=`sed -n 's/[^(]*(\([^) ]*\) KB\/s).*/\1/p' $logfile`
        echo -e "$i\t\c"
        if [ $speed ];then
            printf "%-31s %-s\n" $proxy $speed | tee -a $tempout
        else
            printf "%-31s %-s\n" $proxy "失败"
        fi
        i=$(($i+1))
    done
}
printresult(){
    if [  ! -f $tempout ];then
        echo "所有代理均失败"
        exit 1
    fi
    echo "测试完毕,请选择:
    1 - 输出到$output
    2 - 打印前10"
    rm -rf $output
    read select
    case $select in 
        "1") sort -r -n -k 2 $tempout > $output ;;
        "2") echo -e "代理地址\t\t\t速度(KB/s)";cat $tempout | sort -r -n -k 2 | head -n 10 ;;
        *) echo "参数错误,结果输出到$output" ;;
    esac
}
weburl="http://www.proxycn.com/cnallproxy/page1.htm" 
testurl="http://ppa.launchpad.net/wine-cn/ppa/ubuntu/dists/lucid/Release"
base=/tmp
weblist=$base/weblist
tempout=$base/proxy_test.result
output=$HOME/proxy_test.result
tmpfile=$base/tmpfile
logfile=$base/logfile
if [ -z $1 ];then
    help
    exit 1
fi
if [[ $1 != -* ]];then
    proxy_array=(${proxy_array[*]} $(echo $1 | sed 's/\//\n/g'))
    shift
fi
while getopts ":whf:t:" opt; do
    case $opt in
        f) proxy_array=(${proxy_array[*]} $(cat $OPTARG)) ;;
        w) parse_proxycn ;;
        t) testurl=$OPTARG ;;
        h) help; exit 1 ;;            
        \?) echo "无效选项:-$OPTARG"; exit 1 ;;
        :) echo "选项 -$OPTARG 需要参数"; exit 1 ;;
    esac
done
speedtest
printresult
上次由 lainme 在 2010-09-06 14:22,总共编辑 6 次。
头像
linlee
帖子: 1132
注册时间: 2007-10-20 11:30

Re: 写一个测试代理速度的脚本【编写手记】

#10

帖子 linlee » 2010-08-24 11:49

感谢楼主与lainme
头像
ghostry
帖子: 1532
注册时间: 2008-07-23 20:08
来自: http://www.ghostry.cn
联系:

Re: 写一个测试代理速度的脚本【编写手记】

#11

帖子 ghostry » 2010-08-24 13:11

lainme的看起来专业多了。功能也强些
http://www.ghostry.cn狂网技术工作室,组网建站,平面设计,java项目,空间域名.
好心人点这里进去注册并且用一次,给我增加点流量http://tinyurl.com/272ncjl
电脑配置:
公司:880G/II250/1TB/2G1333/
家:785G+/II245+/1TB/2G677/
tusooa
帖子: 6548
注册时间: 2008-10-31 22:12
系统: 践兔
联系:

Re: 写一个测试代理速度的脚本【编写手记】

#12

帖子 tusooa » 2010-08-24 18:41

额,这年头,那个还用getopts阿。

代码: 全选

] ls -ld //
头像
lainme
论坛版主
帖子: 7805
注册时间: 2008-09-13 19:17
系统: Arch Linux (x86_64)
联系:

Re: 写一个测试代理速度的脚本【编写手记】

#13

帖子 lainme » 2010-08-25 14:34

tusooa 写了:额,这年头,那个还用getopts阿。
乱搜的……
回复