ubuntu 自动选择最快源脚本

转自:http://hi.baidu.com/fancycedar/blog/item/13711c546163821a3b2935f6.html


本本在实验室和寝室间移动来移动去,一个是教育网一个是NB的网通,要装个什么东西就要手动改新立得的软件源,麻烦!

估计在不同网络间移动的你也会有这个苦恼吧!
怎么样才可以知道自己所在的网的最快的软件源是哪个呢?
怎么样才可以轻松地自动更改软件源呢?
怎么样才是技术懒人呢?
想知道答案的往下看。
声明一下,我并非原创作者,但我不知道原作者是谁了……我改了一下使其适用于ubuntu8.04版,对于以后的版本也可以轻松通过更改该脚本实现。好东西与大家分享一下!

,我们需要三个文件:getfastsources, .ubuntu_mirrors, .ubuntu_mirrors.list。注意了,后面两个文件前面有".",是隐藏文件,当让文件名是可以更改的,你喜欢什么就可以改成什么。getfastsources放在/bin下,要有可执行的权限, .ubuntu_mirrors, .ubuntu_mirrors.list放在/home/XXXX下面。

后我们来看看每个文件的具体内容。
1.getfastsources

#!/bin/bash
#------------------------------------------------------------------------#
MIRRORS_LIST=$HOME/.ubuntu_mirrors.list         #文件名和存储位置都可以改,存放所有的源列表
MIRRORS_SCORED=$HOME/.ubuntu_mirrors            #
文件名和存储位置都可以改,存放测试后速度快的几个源
VERSION="hardy"                                #ubuntu版本发生变化时,就更改这个"hardy"为相应的版本号
ARCHITECTURE="i386"
TIMEOUT=20   
CONCURRENT_PROCESSES=30
#------------------------------------------------------------------------#
function cleanup()
{

    if [ -n "$1" -a -d "$1" ]; then
        rm -rf "$1"
    fi
}
check_mirror()
{
    local mirror="$1"
    local url="$mirror/dists/$VERSION/main/binary-$ARCHITECTURE/Packages.gz"
    local state=$(mktemp -p "$workdir")
    local CURL="curl -w %{speed_download} -s -f -m $TIMEOUT -N -o $state"
    local speed=$($CURL $url)
    if [ -f "$state" ];then
        local resp=$(hexdump $state | head | grep '8b1f 0008')
        if [ "$resp" != "" ]; then
            echo $mirror $speed
        fi
        rm -f $state
    fi
}
backup_sources()
{
    echo "Backup your sources.list."
    local -i num=0
    while [ -e /etc/apt/sources.list.$num ];do
       num=$num+1;     
    done
    sudo mv /etc/apt/sources.list /etc/apt/sources.list.$num
}
output_sources()
{
    local COMP="main restricted universe multiverse"
    local mirrors="$1"
    local tmp=$(mktemp)
    local mirror
    for mirror in $mirrors; do
        echo "deb $mirror $VERSION $COMP" >> $tmp
        echo "deb $mirror ${VERSION}-security $COMP" >> $tmp
        echo "deb $mirror ${VERSION}-updates $COMP" >> $tmp
        echo -n "Do you want to include source packages? [y/n]"
        local yn
        read yn
        if [ "$yn" == "y" ]; then
            echo "deb-src $mirror $VERSION $COMP" >> $tmp
            echo "deb-src $mirror ${VERSION}-security $COMP" >> $tmp
            echo "deb-src $mirror ${VERSION}-updates $COMP" >> $tmp
        fi
        echo >> $tmp
    done
    if [ -f "$tmp" ]; then
        echo -n "Do you want to continue? [y/n]"
        local yn
        read yn
        if [ "$yn" != "y" ]; then
            exit 0
        fi
        backup_sources
        sudo mv "$tmp" /etc/apt/sources.list
        echo "Your sources has been updated, and maybe you want to run \"sudo apt-get update\" now. ";
    else
        echo "some badthing has happen...."
        exit 1
    fi
    if [ -f "$tmp" ]; then
        rm -f "$tmp"
    fi
}
choose_mirror()
{
    if [ ! -f "$MIRRORS_SCORED" ]; then
        exit 1
    fi
    local mirrors speeds
    mirrors=$(cat $MIRRORS_SCORED | sed -n "$1 p" | awk '{print $1}')
    speeds=$( cat $MIRRORS_SCORED | sed -n "$1 p" | awk '{print $2}')
    if [ "$mirrors" != "" ]; then
        echo "We have found the top one mirror for you: "
        echo "$mirrors"
        echo "The speed is:"
        echo "$speeds"
        output_sources "$mirrors"
        exit 0
    else
        echo "Why I can't find the best one for you?"
    fi
}
show_help()
{
    echo "Usage 1:"
    echo "`basename $0` [hardy|breezy]"
    echo "hardy is the default version"
    echo "Example:"
    echo "`basename $0` breezy"
    echo
    echo "Usage 2:"
    echo "`basename $0` n"
    echo "n is a number"
    echo "Example:"
    echo "`basename $0` 3"
    echo "Which will choose the 3th mirror from your mirrors as your source"
}
# kill background processes before exit
function kill_bgpid()
{
    local pid
    for pid in ${pids[@]}; do
        kill $pid &> /dev/null
    done
}
#------------------------------------------------------------------------
#------------------------------------------------------------------------
# load mirrors
if [ ! -f "$MIRRORS_LIST" ]; then
    echo "NO ubuntu mirrors list found in $MIRRORS_LIST."
    exit 1
fi
MIRRORS=$(cat "$MIRRORS_LIST")
declare -i counts=$(echo "$MIRRORS"|wc -l)
if (($counts<2)); then
    echo "too few mirrors got from $MIRRORS_LIST"
    exit 1
fi
# parse command line option
if (($#>=1)); then
    if [ "$1" == "dapper" -o "$1" == "breezy" ]; then
        VERSION=$1
    elif (("$1">0)); then
        choose_mirror $1
    else
        show_help
        exit 1
    fi
fi
# The mirror site and the download speed were stored here
workdir=$(mktemp -d /tmp/`basename $0`.XXXXXX)
timer=$(mktemp -p $workdir)
trap "cleanup $workdir" EXIT
echo "Setting $VERSION for you ...";
exec 2>/dev/null        # close standard error output
declare -a pids         # store backgound processes ids
trap 'echo do some cleaning work ....; kill_bgpid; exit 1' INT
declare -i begin=1
declare -i end=$CONCURRENT_PROCESSES
if [ $n -le $CONCURRENT_PROCESSES ]; then
    end=$counts
fi
declare -i num=0
while (($begin <= $counts)); do
    for mirror in $(echo "$MIRRORS" | sed -n "$begin,$end p"); do
        (check_mirror $mirror >> $timer) &
        pids[$num]=$!
        let "num++"
    done
    wait
    # next loop
    begin=$(($end + 1))   
    end=$(($end + $CONCURRENT_PROCESSES - 1))
    if (( $end > $counts ));then
        end=$counts
    fi
done
if [ -f "$timer" ]; then
    declare -i num=0
    while [ -e $MIRRORS_SCORED.$num ];do
       num=$num+1;     
    done
    mv $MIRRORS_SCORED $MIRRORS_SCORED.$num
    cat $timer | sort -k 2 -r -g > $MIRRORS_SCORED
fi
choose_mirror 1
exit 0

2 .ubuntu_mirrors.list

ftp://apt.nc.hcc.edu.tw/pub/ubuntu
ftp://apt.ubuntu.org.tw/ubuntu
ftp://archive.ubuntu.cz/ubuntu
ftp://debian.charite.de/ubuntu
ftp://debian.nsu.ru/ubuntu
ftp://debian.tu-bs.de/ubuntu
ftp://fr.archive.ubuntu.com/ubuntu
ftp://ftp.belnet.be/pub/mirror/ubuntu.com
ftp://ftp.belnet.be/pub/mirror/ubuntu.com/ubuntu
ftp://ftp.bit.nl/ubuntu
ftp://ftp.blueyonder.co.uk/sites/ubuntu/archive
ftp://ftp.cs.mun.ca/pub/mirror/ubuntu
ftp://ftp.ee.ncku.edu.tw/pub/ubuntu
ftp://ftp.esat.net/mirrors/archive.ubuntu.com
ftp://ftp.filearena.net/pub/ubuntu
ftp://ftp.fsn.hu/pub/linux/distributions/ubuntu
ftp://ftp.fu-berlin.de/linux/ubuntu
ftp://ftp.heanet.ie/pub/ubuntu
ftp://ftp.iasi.roedu.net/mirrors/ubuntulinux.org/ubuntu
ftp://ftp.iinet.net.au/pub/ubuntu
ftp://ftp.is.co.za/ubuntu
ftp://ftp.join.uni-muenster.de/pub/mirrors/ftp.ubuntu.com/ubuntu
ftp://ftp.kfki.hu/pub/linux/ubuntu
ftp://ftp.leg.uct.ac.za/pub/linux/ubuntu
ftp://ftp.linux.it/ubuntu
ftp://ftp.litnet.lt/pub/ubuntu
ftp://ftp.lug.ro/ubuntu
ftp://ftp.mirror.ac.uk/mirror/archive.ubuntu.com/ubuntu
ftp://ftp.mirrorservice.org/sites/archive.ubuntu.com/ubuntu
ftp://ftp.ntua.gr/pub/linux/ubuntu
ftp://ftp.oleane.net/pub/ubuntu
ftp://ftp.osuosl.org/pub/ubuntu
ftp://ftp.planetmirror.com/pub/ubuntu/archive
ftp://ftp.polytechnic.edu.na/pub/ubuntulinux
ftp://ftp.proxad.net/mirrors/ftp.ubuntu.com/ubuntu
ftp://ftp.rnl.ist.utl.pt/ubuntu
ftp://ftp.rz.tu-bs.de/pub/mirror/ubuntu-packages
ftp://ftp.se.linux.org/pub/Linux/distributions/ubuntu
ftp://ftp.sjtu.edu.cn/sites/archive.ubuntu.com
ftp://ftp.sun.ac.za/ftp/ubuntu
ftp://ftp.ubuntu-es.org/ubuntu
ftp://ftp.um.es/mirror/ubuntu
ftp://ftp.uni-klu.ac.at/linux/ubuntu
ftp://ftp.uninett.no/linux/ubuntu
ftp://ftp.u-picardie.fr/pub/ubuntu/ubuntu
ftp://ftp.ussg.iu.edu/linux/ubuntu
ftp://gd.tuwien.ac.at/opsys/linux/ubuntu/archive
ftp://klid.dk/ubuntu
ftp://linux.xjtu.edu.cn/mirror/ubuntu/ubuntu
ftp://mir1.ovh.net/ubuntu/ubuntu
ftp://mirror.arcticnetwork.ca/pub/ubuntu/packages
ftp://mirror.clarkson.edu/pub/distributions/ubuntu
ftp://mirror.cpsc.ucalgary.ca/mirror/ubuntu.com
ftp://mirror.isp.net.au/pub/ubuntu
ftp://mirror.letsopen.com/os/ubuntu
ftp://mirror.mcs.anl.gov/pub/ubuntu
ftp://mirror.pacific.net.au/linux/ubuntu
ftp://mirrors.cat.pdx.edu/ubuntu
ftp://mirrors.dk.telia.net/ubuntu
ftp://mirrors.dotsrc.org/ubuntu
ftp://mirror.switch.ch/mirror/ubuntu
ftp://mirrors.xmission.com/ubuntu
ftp://na.mirror.garr.it/mirrors/ubuntu-archive
ftp://nl.archive.ubuntu.com/ubuntu
ftp://os.nchc.org.tw/ubuntu
ftp://ubuntu.inode.at/ubuntu
ftp://ubuntu.mirror.mmd.net/ubuntu
ftp://ubuntu.mirrors.skynet.be/pub/ubuntu.com
ftp://ubuntu.mirrors.tds.net/ubuntu
ftp://ubuntu.task.gda.pl/ubuntu
http://apt.nc.hcc.edu.tw/pub/ubuntu
http://apt.ubuntu.org.tw/ubuntu
http://archive.ubuntu.cz/ubuntu
http://archive.ubuntu.org.cn/ubuntu
http://darkstar.ist.utl.pt/ubuntu/archive
http://debian.charite.de/ubuntu
http://debian.cn99.com/ubuntu
http://debian.nsu.ru/ubuntu
http://debian.okey.net/ubuntu
http://debian.tu-bs.de/ubuntu
http://espelhos.edugraf.ufsc.br/ubuntu
http://fr.archive.ubuntu.com/ubuntu
http://ftp.acc.umu.se/mirror/ubuntu
http://ftp.ale.org/pub/mirrors/ubuntu
http://ftp.belnet.be/pub/mirror/ubuntu.com
http://ftp.belnet.be/pub/mirror/ubuntu.com/ubuntu
http://ftp.bit.nl/ubuntu
http://ftp.cse.yzu.edu.tw/ftp/Linux/Ubuntu/ubuntu
http://ftp.cs.umn.edu/pub/ubuntu
http://ftp.esat.net/mirrors/archive.ubuntu.com
http://ftp.heanet.ie/pub/ubuntu
http://ftp.iasi.roedu.net/mirrors/ubuntu
http://ftp.iasi.roedu.net/mirrors/ubuntulinux.org/ubuntu
http://ftp.iinet.net.au/pub/ubuntu
http://ftp.inf.tu-dresden.de/os/linux/dists/ubuntu
http://ftp.interlegis.gov.br/pub/ubuntu/archive
http://ftp.join.uni-muenster.de/pub/mirrors/ftp.ubuntu.com/ubuntu
http://ftp.kaist.ac.kr/pub/ubuntu
http://ftp.kfki.hu/linux/ubuntu
http://ftp.linux.it/ubuntu
http://ftp.litnet.lt/pub/ubuntu
http://ftp.lug.ro/ubuntu
http://ftp.ntua.gr/pub/linux/ubuntu
http://ftp.oleane.net/pub/ubuntu
http://ftp.osuosl.org/pub/ubuntu
http://ftp.roedu.net/mirrors/ubuntu
http://ftp.rz.tu-bs.de/pub/mirror/ubuntu-packages
http://ftp.ucr.ac.cr/ubuntu
http://ftp.u-picardie.fr/pub/ubuntu/ubuntu
http://ftp.ussg.iu.edu/linux/ubuntu
http://gd.tuwien.ac.at/opsys/linux/ubuntu/archive
http://godel.cs.bilgi.edu.tr/mirror/ubuntu
http://itanix.rutgers.edu/ubuntu
http://kambing.vlsm.org/ubuntu
http://klid.dk/homeftp/ubuntu
http://komo.vlsm.org/ubuntu
http://lug.mtu.edu/ubuntu
http://mir1.ovh.net/ubuntu/ubuntu
http://mirror.arcticnetwork.ca/pub/ubuntu/packages
http://mirror.clarkson.edu/pub/distributions/ubuntu
http://mirror.cpsc.ucalgary.ca/mirror/ubuntu.com
http://mirror.freax.be/ubuntu/archive.ubuntu.com
http://mirror.isp.net.au/ftp/pub/ubuntu
http://mirror.letsopen.com/os/ubuntu
http://mirror.lupaworld.com/ubuntu/archive
http://mirror.mcs.anl.gov/pub/ubuntu
http://mirror.optus.net/ubuntu
http://mirror.pacific.net.au/linux/ubuntu
http://mirrors.cat.pdx.edu/ubuntu
http://mirrors.cs.wmich.edu/ubuntu
http://mirrors.dk.telia.net/ubuntu
http://mirrors.dotsrc.org/ubuntu
http://mirror.switch.ch/ftp/mirror/ubuntu
http://mirrors.xmission.com/ubuntu
http://mirror.trivini.no/ubuntu
http://mirror.vmmatrix.net/ubuntu
http://na.mirror.garr.it/mirrors/ubuntu-archive
http://nl.archive.ubuntu.com/ubuntu
http://ubuntu-arch.linux.edu.lv/ubuntu
http://ubuntu.blueyonder.co.uk/archive
http://ubuntu.c3sl.ufpr.br/ubuntu
http://ubuntu.cn99.com/ubuntu
http://ubuntu.csie.ntu.edu.tw/ubuntu
http://ubuntu.cs.utah.edu/ubuntu
http://ubuntu.dcc.fc.up.pt
http://ubuntu.inode.at/ubuntu
http://ubuntu.interlegis.gov.br/archive
http://ubuntulinux.mainseek.com/ubuntu
http://ubuntu.mirror.mmd.net/ubuntu
http://ubuntu.mirrors.skynet.be/pub/ubuntu.com
http://ubuntu.mirrors.skynet.be/pub/ubuntu.com/ubuntu
http://ubuntu.mirrors.tds.net/ubuntu
http://ubuntu.mithril-linux.org/archives
http://ubuntu.odg.cc
http://ubuntu.secs.oakland.edu
http://ubuntu.synssans.nl
http://ubuntu.uni-klu.ac.at/ubuntu
http://www.artfiles.org/ubuntu.com
http://www.ftp.uni-erlangen.de/pub/mirrors/ubuntu
http://www.mirror.ac.uk/mirror/archive.ubuntu.com/ubuntu
http://www.mirrorservice.org/sites/archive.ubuntu.com/ubuntu
http://www.opensourcemirrors.org/ubuntu

3 .ubuntu_mirrors
创建一个空文件就行。

后,确保你的getfastsources放在了/bin下,.ubuntu_mirrors和.ubuntu_mirrors.list在你的主目录下后,就可以执行getfastsources了!
开始执行时,测试各个源比较消耗时间一点,耐心等待大概30秒把。
如果出现:
fancy@FANCY:~$ getfastsources
Setting hardy for you ...
We have found the top one mirror for you:
http://archive.ubuntu.org.cn/ubuntu
The speed is:
266730.000
Do you want to include source packages? [y/n]y
Do you want to continue? [y/n]y
Backup your sources.list.
[sudo] password for fancy:
Your sources has been updated, and maybe you want to run "sudo apt-get update" now.
fancy@FANCY:~$

就恭喜你了!脚本起作用了!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值