转自: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:~$
就恭喜你了!脚本起作用了!