欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

Shell脚本实现检测Cygwin最快的镜像站点

程序员文章站 2022-06-02 08:46:52
这是一个 shell 脚本,所以首先你需要安装一个基本的 cygwin 环境,当然还有 curl。 原理很简单,先从 cygwin.com 下载最新的 mirrors.l...

这是一个 shell 脚本,所以首先你需要安装一个基本的 cygwin 环境,当然还有 curl。

原理很简单,先从 cygwin.com 下载最新的 mirrors.lst 镜像列表,简单处理一下后,利用 curl 以此检测每个站点的连接速度,并将结果记录下来,最后再排个序,显示出最快的几个站点。

在使用的过程中,我发现检测到的最快的 mirror,实际上使用速度并不一定是最快的,这可能和服务器有关系,毕竟 curl 检测的时间只是读取 mirror 首页的时间。不过每个 mirror 一般都有两组服务器——http & ftp,如果其中一个速度不怎么样,那么可以选择另外一个试试看。

复制代码 代码如下:

#!/bin/sh
 
# cygwin-mirrors.sh
# 该脚本用于查找 cygwin 的最快镜像
 
timeout=5           # 超时时间
mirrors_count=5     # 显示最快的几个镜像
prog=`basename $0`  # 程序名称
 
## 显示 usage
_usage() {
    echo "usage: ${prog} [-t <timeout>] [-p <mirrors_count>] [-h]"
    exit
}
 
## 检查参数并赋值
_assign() {
    if [ "$1" == "timeout" -o "$1" == "mirrors_count" ]; then
        if [[ "$2" =~ ^[[:digit:]]+$ ]]; then
            let $1=$2
        else
            echo "$1 should be a number"
            exit 1
        fi
    fi
}
 
## 处理参数
while getopts ":t:p:h-:" optval
do
    case "$optval" in
        t)   _assign timeout ${optarg} ;;
        p)   _assign mirrors_count ${optarg} ;;
        h)   _usage ;;
        "-") echo "unknown option: '--${optarg}'" >&2;            _usage ;;
        ":") echo "option '-${optarg}' requires an argument" >&2; _usage ;;
        "?") echo "unknown option: '-${optarg}'" >&2;             _usage ;;
        ## should not occur
        *)   echo "unknown error while processing options" >&2;   _usage ;;
    esac
done
shift $(expr ${optind} - 1)
 
## 检查用户是否安装了 curl
curl=`which curl 2> /dev/null`
[ -z "$curl" ] && (echo "need to install the curl package."; exit 1)
 
## 读取镜像站点
mirrors=`curl --silent http://cygwin.com/mirrors.lst | cut -d';' -f1`
 
## 使用 curl 依次检测时间
results=''
for mirror in $mirrors; do
    echo -n "checking ${mirror} ... "
    time=`curl -m $timeout -s -o /dev/null -w %{time_total} $mirror`
    if [ "$time" = "0.000" ]; then
        echo -e "\e[31mfail\e[0m"
    else
        echo -e "\e[32m$time\e[0m"
        results="${results}\e[32m${time}\e[0m - ${mirror}\n"
    fi
done
 
echo -e "\n检测结果:"
echo -e $results | sort -n | sed '1d' | head -$mirrors_count
 
# vim: set expandtab tabstop=4 shiftwidth=4: