Shell腳本自動檢測最快的Ubuntu軟件源

from Pure Weber Shell脚本: 自动检测最快的Ubuntu软件源 | Pure Weber.

每次装好Ubuntu,对于大多数用户来说,首先要做的事就是手动修改/etc/apt/sources.list文件,将里面的官方软件源地址更换为自己学校或者公司的软件源。当我们更换一个工作环境后,可能伴随着又要替换旧的软件源地址。

笔者觉得这样每次手动更改软件源是一件及其麻烦重复的劳动,于是编写了一个自动更新最快软件源的脚本,从此一劳永逸。

原理

最直观的想法就是:对各个软件源进行测速,选出最快的那个,之后将其替换为新的软件源。

那么如何对各个软件源测速呢?有两种方法:

一、用ping命令 测量其平均响应时间 选出响应时间最短的那个 二、用wget命令 测量下载一个文件的总时间 选出耗时最少的那个

那么这两种方法有什么区别呢?我们该用哪个呢?

前者选出的是响应时间最优的,后者选出的是下载速度最快的。我们都知道软件源的作用是供客户端下载更新软件,所以当然是后者的方法更为准确,但笔者 最终选择了前者作为测速方案,因为前者的用户体验更好且代码简单易懂。设想,如果我们采用后者,那么需要从每个软件源下载一个文件,并且这个文件不能太 小,否则无法区分他们的速度,那么一个显而易见的情况是脚本需要运行较长的时间。

虽然存在某些软件源可能响应时间很短,而下载速度却很慢的情况,但经过笔者的多次实验,发现这样的情况并不常见。

实现

首先测试用户网络状态

利用

  1. local speed=`ping -W1 -c1 http://www.baidu.com 2> /dev/null | grep “^rtt" |  cut -d ‘/’ -f5`

取出其平均响应时间 如果speed == “” 则说明网络不通,提示用户,且退出程序。 否则,说明网络正常,继续执行。

检测软件源列表文件是否存在

  1. test -f $SOURCES_MIRRORS_FILE

若不存在,提示用户,且退出程序。

对每个软件源地址进行测速

在测速之前清空上次运行的测速结果文件,之后将每个软件源的测速结果(源地址 平均响应时间)写入测速结果文件

对测速结果进行排序

  1. sort -k 2 -n -o $MIRRORS_SPEED_FILE $MIRRORS_SPEED_FILE

对每行记录 按照平均响应时间升序排列

选出最快的软件源

  1. head -n 1 $MIRRORS_SPEED_FILE | cut -d ‘ ‘ -f1 `

通过取已排序列表中的第一条,选出最快的软件源

询问用户是否要使用该软件源

用户确认后,先对用户之前的软件源进行备份,然后再替换。

脚本源代码

最新版本:https://github.com/KJlmfe/soEasyUbuntu/tree/master/getfastmirror

  1. #!/bin/bash
  2. #Program:
  3. #    This program gets the fastest ubuntu software sources from SOURCES_MIRRORS_FILE
  4. #    and backup && update /etc/apt/sources.list
  5. #Author:  KJlmfe    http://www.freepanda.me
  6. #History:
  7. #    2012/12/6    KJlmfe    First release
  8. VERSION="precise"  # precise is code of Ubuntu 12.04 if your ubuntu is not 12.04 please change
  9. TEST_NETCONNECT_HOST="www.baidu.com"
  10. SOURCES_MIRRORS_FILE="sources_mirrors.list"
  11. MIRRORS_SPEED_FILE="mirrors_speed.list"
  12. function get_ping_speed()    #return average ping $1 time
  13. {
  14.     local speed=`ping -W1 -c1 $1 2> /dev/null | grep “^rtt" |  cut -d ‘/’ -f5`
  15.     echo $speed
  16. }
  17. function test_mirror_speed()    #
  18. {
  19.     rm $MIRRORS_SPEED_FILE 2> /dev/null; touch $MIRRORS_SPEED_FILE
  20.      cat $SOURCES_MIRRORS_FILE | while read mirror
  21.     do
  22.         if [ “$mirror" != “" ]; then
  23.             echo -e “Ping $mirror \c"
  24.             local mirror_host=`echo $mirror | cut -d ‘/’ -f3`    #change mirror_url to host
  25.             local speed=$(get_ping_speed $mirror_host)
  26.             if [ “$speed" != “" ]; then
  27.                 echo “Time is $speed"
  28.                 echo “$mirror $speed" >> $MIRRORS_SPEED_FILE
  29.             else
  30.                 echo “Connected failed."
  31.             fi
  32.         fi
  33.     done
  34. }
  35. function get_fast_mirror()
  36. {
  37.     sort -k 2 -n -o $MIRRORS_SPEED_FILE $MIRRORS_SPEED_FILE
  38.     local fast_mirror=`head -n 1 $MIRRORS_SPEED_FILE | cut -d ‘ ‘ -f1`
  39.     echo $fast_mirror
  40. }
  41. function backup_sources()
  42. {
  43.     echo -e “Backup your sources.list.\n"
  44.     sudo mv /etc/apt/sources.list /etc/apt/sources.list.`date +%F-%R:%S`
  45. }
  46. {
  47. function update_sources()
  48.     local COMP="main restricted universe multiverse"
  49.     local mirror="$1″
  50.     local tmp=$(mktemp)
  51.     echo “deb $mirror $VERSION $COMP" >> $tmp
  52.     echo “deb $mirror $VERSION-updates $COMP" >> $tmp
  53.     echo “deb $mirror $VERSION-backports $COMP" >> $tmp
  54.     echo “deb $mirror $VERSION-security $COMP" >> $tmp
  55.     echo “deb $mirror $VERSION-proposed $COMP" >> $tmp
  56.     echo “deb-src $mirror $VERSION $COMP" >> $tmp
  57.     echo “deb-src $mirror $VERSION-updates $COMP" >> $tmp
  58.     echo “deb-src $mirror $VERSION-backports $COMP" >> $tmp
  59.     echo “deb-src $mirror $VERSION-security $COMP" >> $tmp
  60.     echo “deb-src $mirror $VERSION-proposed $COMP" >> $tmp
  61.     sudo mv “$tmp" /etc/apt/sources.list
  62.     echo -e “Your sources has been updated, and maybe you want to run \"sudo apt-get update\" now.\n";
  63. }
  64. echo -e “\nTesting the network connection.\nPlease wait…   \c"
  65. if [ “$(get_ping_speed $TEST_NETCONNECT_HOST)" == “" ]; then
  66.     echo -e “Network is bad.\nPlease check your network."; exit 1
  67. else
  68.     echo -e “Network is good.\n"
  69.     test -f $SOURCES_MIRRORS_FILE
  70.     if [ “$?" != “0″ ]; then
  71.         echo -e “$SOURCES_MIRRORS_FILE is not exist.\n"; exit 2
  72.     else
  73.         test_mirror_speed
  74.         fast_mirror=$(get_fast_mirror)
  75.         if [ “$fast_mirror" == “" ]; then
  76.             echo -e “Can’t find the fastest software sources. Please check your $SOURCES_MIRRORS_FILE\n"
  77.             exit 0
  78.         fi
  79.         echo -e “\n$fast_mirror is the fastest software sources. Do you want to use it? [y/n] \c"
  80.         read choice
  81.         if [ “$choice" != “y" ]; then
  82.             exit 0
  83.         fi
  84.         backup_sources
  85.         update_sources $fast_mirror
  86.     fi
  87. fi
  88. exit 0

本文短网址:http://goo.gl/btNwP

 

 

另外,一個手動的Ubuntu Sources List Generator速度探測網站也挺好的,

http://repogen.simplylinux.ch/

1 則迴響 (+add yours?)

  1. kjlmfe
    四月 07, 2013 @ 21:59:37

    吼吼吼 貌似这是我第一篇被人转载的文章 原文:http://blog.freepanda.me/archives/1128

    回覆

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s

%d 位部落客按了讚: