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 次。
-
ghostry
- 帖子: 1532
- 注册时间: 2008-07-23 20:08
- 来自: http://www.ghostry.cn
-
联系:
#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
-
ghostry
- 帖子: 1532
- 注册时间: 2008-07-23 20:08
- 来自: http://www.ghostry.cn
-
联系:
#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那里写的下载的文件大小很重要。太小测速不准,太大就太慢了。
-
ghostry
- 帖子: 1532
- 注册时间: 2008-07-23 20:08
- 来自: http://www.ghostry.cn
-
联系:
#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
-
tusooa
- 帖子: 6548
- 注册时间: 2008-10-31 22:12
- 系统: 践兔
-
联系:
#6
帖子
由 tusooa » 2010-08-13 0:36
脚本没试。不过变量名太bt,实在口口。
变量名字都没意义的,不好维护。
为什么要下载到d.txt,/tmp不是很好的存放点吗?
-
lainme
- 论坛版主
- 帖子: 7805
- 注册时间: 2008-09-13 19:17
- 系统: Arch Linux (x86_64)
-
联系:
#8
帖子
由 lainme » 2010-08-19 12:50
好工具。变量名……确实BT得可以。
我拿去改改……
-
lainme
- 论坛版主
- 帖子: 7805
- 注册时间: 2008-09-13 19:17
- 系统: Arch Linux (x86_64)
-
联系:
#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/ /\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
#10
帖子
由 linlee » 2010-08-24 11:49
感谢楼主与lainme
-
tusooa
- 帖子: 6548
- 注册时间: 2008-10-31 22:12
- 系统: 践兔
-
联系:
#12
帖子
由 tusooa » 2010-08-24 18:41
额,这年头,那个还用getopts阿。
-
lainme
- 论坛版主
- 帖子: 7805
- 注册时间: 2008-09-13 19:17
- 系统: Arch Linux (x86_64)
-
联系:
#13
帖子
由 lainme » 2010-08-25 14:34
tusooa 写了:额,这年头,那个还用getopts阿。
乱搜的……