2011年10月11日 星期二

[Learning Python] Collection Data Type -- Tuple(元組)

A. Tuple

    1. Tuple 是個可以將不同資料型別的 Object  Reference 放到一個單一序列的集合,而 Tuple 一旦被建立其內容就無法被改變。

    2. 建立 Tuple 的語法如下,

(Item1 , Item2 , Item3,....)                             




tupleName = (Item1 , Item2 , Item3,....)                             



    3. 可以用索引的方式取用 Tuple 中的元素

定義Tuple
>>> demoTuple=(1,2,3,'a','B','Ayana','satomi')                                         

印出整個Tuple
>>> print demoTuple
(1, 2, 3, 'a', 'B', 'Ayana', 'satomi')

印出第二個元素
>>> print demoTuple[1]
2

印出最後一個元素
>>> print demoTuple[-1]         
satomi
>>>
                 


















     4. 與其他 Object 合併結合成為新的 Tuple

定義整數物件
>>> x=123

定義另一個 Tuple
>>> otherTuple=(1,2,3,4)

合併
>>> demoTuple+(x,otherTuple)
(1, 2, 3, 'a', 'B', 'Ayana', 'satomi', 123, (1, 2, 3, 4))                                                     











    5. 要變更 Tuple 的資料項有兩個方法

        a. list()

        b. Temp Tuple 

    6. tupleName.count(Target)

        計算 Target 在 Tuple 中出現的次數。

    7.  tupleName.index(Target)

        回傳 Target 在  Tuple 中首次出現的位置,若 Target 不存在於 Tuple 中則拋出『ValueError』Exception。

   8. Tuple 可使用的運算 :
            a. concatenation : 『+』。
            b.replication :『*』。
            c. slice : 『[]』。
           d. membership operation : 『in』、『not in』。
          e. augmented assignment operation : 『+=』、『-=』。
          f. binary comparison operation : 『<』、『<=』、『==』、『!=』、『>=』、『>』。



    

2011年10月10日 星期一

[Learning Python] Control Flow

1. Conditional Branching

    毫無意外的 Python 的 conditional branching還是由 if  來提供。

    if 的一般語法如下,

if <Boolean Expression 1>:
    suite_1
elif <Boolean Expression 2>:                                                         
    suite_2
elif <Boolean Expression 3>:
    suite_3
    ................
    ................
    ................
else:
    Default_suite 













2. Ternary  Expression

    實作 Ternary Expression 的 if 語法。

<Var = Value_A> if <Boolean Expression> else <Value_B>                 




     或

<Var = Value_A> if not <Boolean Expression> else <Value_B>                 



3.Multiway  Branching

    Multiway Branching 也可以用字典來實作

check = Value
print({Value1:OutputInfo1,
             Value2:OutputInfo2,
             Value3:OutputInfo3,
              ...................
              ...................   

             ValueN:OutputInfoN}[check])                                               













2. while loops

    while loops 的語法如下,

while <Boolean Expression>:                     
     while suite
else:
    else suite                                 








3.for loops

    for loops  的語法如下,

for <Target> in <Object>:                     

    for suite
else:
    else suite                                 








  • Iteration(迭代)
        所謂『Iteration』是指重複進行同一項作業,直到所有可處理的對象都被處理完畢為止,其實也就是『重複操作』的意思,不過,用『迭代』稱呼,光看就覺得.....『 好厲害啊...迭代耶~~~』,所以後面還是稱『Iteration』為『迭代』。

    『Sequence Data Type』類的資料型別,如『String』、『List』、『Tuple』都可以利用『for loops』執行『迭代』 重複對其中的所有元素執行相同的操作。

    『for loops』的『迭代』語法如下,

    for loops  的『迭代』語法如下,

for <ControlVariable> in <Object>:          
    suite



 
 
    或

for <ControlVariable> in <Object>: suite   



    以『迭代』的方式列印字串

>>> for I in 'Iteration': print I        
... 
I
t
e
r
a
t
i
o
n
   



   






 
         以『迭代』的方式列印『List』


>>> for I in ['Iteration1','Iteration2','Iteration3']: print I
... 
Iteration1
Iteration2
Iteration3



   

  

         以『迭代』的方式列印『Tuple』


>>> for I in ('Iteration1','Iteration2','Iteration3'): print I
... 
Iteration1
Iteration2
Iteration3



   



    可以用『迭代』的方式一一將序列中的元素印出來,當然也可以作別的事情。










以『迭代』的方式列印字串


        將『String』

[Learning Python] Programming in Python

              String

                  建立字串
                  不同型態的引號
                 字串輸出格式控制 
           
              List
  •  Collection Data Type
               List

2011年10月6日 星期四

[Learning Python] 基本預備知識

    在開始動手寫之前,先整理一下需要知道的預備知識。


1. Python2 & Python3  together

    我的實驗環境是『Ubuntu 11.04』上面已經裝好了『Python 2.7.1+』,『Python 2』直譯器的所在位置是『/usr/bin/python』。

$ python -V
Python 2.7.1+
 
$ which python
/usr/bin/python                                         






    




    如果直接從『 Ubuntu』的套件庫安裝『Python 3』,雖然『Python 3』直譯器也是會被安裝在『/usr/bin』目錄中,但是名稱會變成『python3』因此同時並存並不會發生衝突,所以就直接安裝啦~~~


$ sudo apt-get install python3                          
 
$ python -V
Python 2.7.1+
$ python3 -V
Python 3.2
 
$ which python
/usr/bin/python
$ which python3
/usr/bin/python3              







 











2.誰要來解釋Script 的內容?

    當妳在『Linux』作業系統執行一支 『可執行檔』時,妳所使用的『Shell』會先讀取 『可執行檔』最開頭的兩個『Byte』。

    如果最開頭的兩個『Byte』是『#!』,也就是整支程式第一行最開頭的兩個『Byte』是『#!』,『Shell』會假設這是一支『Script』,這支 『Script』第二行起以後的內容『Shell』就會交由『#!』這一行所標示的直譯器來解釋。

    所以如果所撰寫的『Script』是 for『Python 2』,『Script』的第一行就是,

#!/usr/bin/python                                                




#!/usr/bin/env python                                   



    如果所撰寫的『Script』是 for『Python 3』,『Script』的第一行就是,

#!/usr/bin/python3                                                




#!/usr/bin/env python3                                   



    當然,如果要讓一支『 Script』變成『可執行檔』需要賦予這支『Script』可執行屬性,

chmod  +x  <ScriptName>                                  



3.副檔名

    雖然在『Linux』作業系統中『副檔名』並不具檔案類型關聯的功能,不過為了方便識別,習慣上我們會以『.py』做為『Python』程式的副檔名,以『.pyw』做為『Python GUI』程式的副檔名。

4.如何執行

    如果『Python』Script 已經被賦予了『可執行屬性』可以直接以完整路徑來執行這支 Script,

$ /PATH/.../<ScriptName>                              


 
    或切換工作目錄到 Script 所在目錄再執行它,
 
$ ./<ScriptName>                              


 
    如果『Python』Script未被賦予『可執行屬性』,可以把它當成『Python』直譯器的參數"喂"給『Python』直譯器
 
$ python   <ScriptName>                            


                      
$ python3   <ScriptName>                          


 
5.註解

    『 Python』有兩種註解符號,單行註解符號是『#』,多行註解則是以『'''』開頭『'''』結尾或『"""』開頭『"""』結尾。


#!/usr/bin/python3  
#
#『 #』之後的文字都會被視為註解文字
#
'''   從這一行開始
   
    之間所有的文字都會被視為註解文字                                          
    
'''   到這一行結束

""" 這樣
      也是
      多行
      註解
"""          
















    

6. 中文註解

    如果是使用『Python 2』直譯器,要在 Script 加中文註解,需先作如下宣告 ,
       
#-*- coding: utf-8 -*                       



    否則會出現如下錯誤,
       
$ python notest.py
  File "notest.py", line 3
SyntaxError: Non-ASCII character '\xe4' in file notest.py on line 3, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details


$ python3 notest.py
中文註解測試
               




    

    『Python 3』就不需要了。

7.  資料型別(Data Type) / 物件型別(Object Type)

   由於 Python 將所有的資料(Data)都當成物件(Object),所以之後無論是 Data Type 或 Object Type 其實都是指同一件事,不過之後都一律統一稱為『 Data Type』。

    另外 Python  並不需要對變數的『 Data Type』作宣告, Python 會依照變數賦值時所用的語法來決定變數的『 Data Type』。

8. 變數(variable)與變數賦值

    雖然行為是一樣的,但 Python 其實並沒有『變數』這種東西,她是用『Object reference(物件參照)』的方法處理『變數賦值』這個行為。

    與多數程式語言一樣,在進行所謂『變數賦值』這個行為時 Python會用到『=』這個符號,,例如,

      
String1 = 'String Object'                     



    由於給定的值被『'』刮起來,所以 Python會建立一個『str』物件 -- 'String Object',及一個指向這個物件的  『Object reference(物件參照)』-- String1  。

   值給定後 Python 會建立一個物件及指向這個物件的『Object reference(物件參照)』,也就是...
       
變數賦值......

VariableName = <Vaule>                                                 


其實就是建立『Object reference(物件參照)』


Object reference = <Vaule>               


  


 



    所以有『 Data Type』的是物件本身而非『Object reference(物件參照)』。

9. Identifier (識別字)

    變數名稱也就是『Object reference(物件參照)』的名稱稱為『 Identifiers (識別字)』或是『name』,命名時需依據下列規則,

    a. 首字要是一個英文字母(其實可以是任何Unicode中各種語系的字母,不過如果沒有特殊的嗜好,最好就限定只用英文大小寫字母會)或『_ (under line)』。
    b. 第二個字元起可以使用所有 Unicode 所定義的字元符號,但空白字元符號除外。
    c. 大小寫有別(Case Sensitive),沒有長度限制。
    d. 不能與 Python 的關鍵字(Keywords)撞名。

10. Compound statement (複合敘述)and 縮排

    每個 Compound statement 的首行會以『:』結尾,而 Python 是以縮排來決定 Block(程式區塊)的邊界,同時也是以縮排與否來判定 suite 是不是屬於某個 Compound statement ,所以屬於 if 、while 這一類Compound statement的 suite 一定要作縮排。

     可以用『tab』或『space』來縮排,不過習慣上每一層級縮排會用四個『space』。


Compound Statement:                    
    suite                              





11.Logical Operation(邏輯運算)

    a. Identity  Operator : 『is』、『is not』。
    b. Binary Comparison Operator : 『<』、『<=』、『==』、『!=』、『>=』、『>』。
    c. Membership Operator : 『in』、『not in』。
    d. Logical Operator : 『and』、『not』、『or』。

2011年9月30日 星期五

[KVM]在 TUI 環境下建置 Virtualized guest

   如果妳有 X Window,不管是在 VM Server 也就是 『Host』 或是另一台『Desktop』,妳都可以利用『Virt-Manager』進行相當完整且深入的管理,基本上除非有特別的嗜好,否則並沒有非得在 TUI 環境下建置 VM guest 的必要,而且,只能使用 TUI 的環境來建置 VM guest 的狀況在實務上幾乎是不存在的。

    不過,如果要談在 TUI 環境下來管理妳的 VM ,不從建置開始談好像有點不完整,所以這邊還是從如何建置一台全新的  VM guest 開始談起。

   以下都是從我的筆電使用 ssh 遠端連線到 VM Server 進行實作,使用到的工具有『virsh』、『virt-install』及『vinagre』。

    妳可以選擇進到『virsh』或是在 TUI 使用 Command 來建置 VM guest ,不過事實上是同一件事,這邊是選擇 進到『virsh』。

    所要建置的VM guest 規劃如下,

        a.OS : Ubuntu 10.04.3 Server
        b.Architecture : X86_64
        c.CPU *1 / RAM : 1024 MB
        d.HD : Format : qcow2 size: 8G
        e.Network : Bridge:br0
        
    1. 建立虛擬硬碟

        如果不需要指定虛擬硬碟的格式可以跳過這一步。

        a. 列出現有 Storage Pool 清單

            主要是要確認一下 Storage Pool 的名稱,因為我打算將虛擬硬碟的映像放在『VM-Image』這個 Storage Pool 中。


virsh # pool-list --all

名稱               狀態                    自動啟動
-----------------------------------------                                                    
default                啟用                yes     
image                 啟用                yes     
VM-Image           啟用                yes
Iso                     非啟用中           yes    





    



        b. 產生虛擬硬碟     

virsh # vol-create-as --format qcow2 VM-Image test.qcow2.img 8G
Vol test.qcow2.img created




        也可以使用『kvm-image』來產生虛擬硬碟,不過要到使用『virt-install 』建置 VM quest 之後 『virsh』才能管理這顆虛擬硬碟。

max@riyu:~$ kvm-img create -f qcow2 /media/SDA3/VmImage/disk.qcow2.img 8G    
Formatting '/media/SDA3/VmImage/disk.qcow2.img', fmt=qcow2 size=8589934592 encryption=off cluster_size=0





        確認一下

virsh # vol-list VM-Image
名稱                                    Path                                  
-----------------------------------------
test.qcow2.img       /media/SDA3/VmImage/test.qcow2.img    




       

    2. 建置 VM guest

      依照規劃需要下一串又臭又長的命令來作這件事。

       退出『virsh』後,使用如下命令來建置一台 VM guest

max@riyu:~$ virt-install \
> --connect qemu:///system \
> --name=Test \
> --vcpus=1 \
> --arch=x86_64 \
> --ram=1024 \
> --os-type=linux \
> --virt-type=kvm \
> --cdrom=/media/SDC7/001.LinuxISO/ubuntu-10.04.3-server-amd64.iso \
> --disk path=/media/SDA3/VmImage/test.qcow2.img,size=8 \
> --force \
> --network bridge=br0,model=virtio \
> --vnc  --vncport=5900
Traceback (most recent call last):
  File "/usr/lib/python2.6/logging/handlers.py", line 71, in emit
    if self.shouldRollover(record):
  File "/usr/lib/python2.6/logging/handlers.py", line 144, in shouldRollover
    msg = "%s\n" % self.format(record)
  File "/usr/lib/python2.6/logging/__init__.py", line 648, in format
    return fmt.format(record)
  File "/usr/lib/python2.6/logging/__init__.py", line 439, in format
    s = self._fmt % record.__dict__
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 1: ordinal not in range(128)



Starting install...
Creating domain... 0 B 00:00
Unable to connect to graphical console: virt-viewer not installed. Please install the 'virt-viewer' package.
Domain installation still in progress. You can reconnect to
the console to complete the installation process.





       
    接下來要透過 VNC 進到剛出生的 VM quest 來進行作業系統的安裝,不過要從遠端主機透過VNC 連到 VM quest 還需要動一些手腳而且有點安全上的疑慮,所以這邊就直接利用 ssh 的『X11Forwarding』將從 VM Server 透過 VNC 連到 VM quest 的畫面送到我的筆電。

    3. 重新連線到 VM Server

         要記得開啟 『X11Forwarding』。

max@minako:~$ ssh -X max@10.0.0.100                    





    4. 從 VM Server 端啟動『vinagre』       

max@riyu:~$ vinagre localhost:5900                   


   


    由於這次連線已經啟動了『X11Forwarding』,所以『vinagre』的執行畫面會送回筆電。



        之後就跟一般安裝作業系統的程序一樣,作業系統安裝完畢,妳就有一台  VM 可以用啦。     


virsh # list 
 Id 名稱                  狀態
----------------------------------
  6 Test                 執行中
                   

2011年9月21日 星期三

[Bash Script]將筆電中的資料備份到備份主機 (V201109210305)

前一版邏輯有嚴重錯誤而且寫得太囉唆了,全部重寫~~~~~~~
ChangeLog
1. if 條件判斷改用設檢查旗標的方式同時用了『複合條件判斷』以濃縮長度。
2.『全變數化』以方便維護跟新增備份標的。

筆電中放著不少重要資料,還是備份一下比較安心。

條件一樣是,
1.筆電在家且連得到備份主機才進行備份
2.自動砍掉三天以前的備份

Script 內容如下,

#!/bin/bash
#DailyBackUpV201109210305.sh
#備份筆電中的重要資料
#Verio:3.0
#Time:201109210305
#Max Lin max@mpsstudio.org

#定義變數
LogFile="$HOME/BackUpLog/DailyBackUp.log"
RemoteHost="10.128.0.100"
TEMPDir="/tmp/DocBack"
LXDETEMPDir=""$TEMPDir"/LXDE"
ScriptTEMPDir=""$TEMPDir"/Script"
DocTEMPDir=""$TEMPDir"/Doc"
MyPassWord="1979576"
MyAccount="亞利安人"
MountHomeDir='/home/max/sharedir'
LocalMountDir=""$MountHomeDir"/100DocBackup"
RemoteHostMountOption="rw,noperm,nosuid,username="$MyAccount",password="$MyPassWord",iocharset=utf8,codepage=cp950"
LXDEBackDir="/home/max/.config/lxpanel/LXDE/"
ScriptBackDir="/home/max/Script"
DocMountPoint="/media/DATABack"
DocBackDir=""$DocMountPoint"/002.文件/"

#Start

#確認遠端備份主機連線狀態
ping -c 2 $RemoteHost > /dev/null
ConnectCheck=$?

#確認備份儲存目錄是否已掛載
mount | grep "100DocBackup" > /dev/null
RemoteHostMountCheck=$?
if [ $RemoteHostMountCheck -ne '0' ] ; then

#掛載遠端文件備份掛載目錄
echo "$MyPassWord" | sudo -S mount -t cifs //"$RemoteHost"/DocBackup "$LocalMountDir" -o "$RemoteHostMountOption"
RemoteHostMountCheck=$?
else
RemoteHostMountCheck=0
fi


if [ $ConnectCheck -eq '0' -a $RemoteHostMountCheck -eq '0' ]; then

echo "`date '+%Y%m%d'` ---- 備份作業開始 --------" >> $LogFile
echo "`date '+%Y%m%d'` ==== 備份開始時間`date '+%H:%M:%S'`" >> $LogFile

#備份LXDE設定檔
mkdir -p "$LXDETEMPDir"
tar jcvf "$LXDETEMPDir"/LXDEConfigBackUp`date '+%Y%m%d'`.tar.bz2 "$LXDEBackDir"
LXDETar=$?
cp -r "$LXDETEMPDir"/* "$LocalMountDir"
LXDECpCheck=$?

if [ $LXDETar -eq '0' -a $LXDECpCheck -eq '0' ] ; then
echo "`date '+%Y%m%d'` LXDE設定檔備份作業完成~~~" >> $LogFile
else
echo "`date '+%Y%m%d'` LXDE設定檔備份作業未完成!!!!" >> $LogFile
fi


#備份Script
mkdir -p "$ScriptTEMPDir"
tar jcvf "$ScriptTEMPDir"/ScriptBackUp`date '+%Y%m%d'`.tar.bz2 "$ScriptBackDir"
ScriptTar=$?
cp -r "$ScriptTEMPDir"/* "$LocalMountDir"
ScriptCpCheck=$?
if [ $ScriptTar -eq '0' -a $ScriptCpCheck -eq '0' ] ; then
echo "`date '+%Y%m%d'` Script備份作業完成~~~" >> $LogFile
else
echo "`date '+%Y%m%d'` ScriptCpCheck備份作業未完成!!!!" >> $LogFile
fi

#文件備份
mkdir -p "$DocTEMPDir"
mount | grep "$DocMountPoint"
DocMountPointCheck=$?
if [ $DocMountPointCheck -eq '0' ] ; then
tar jcvf "$DocTEMPDir"/DocBackUp`date '+%Y%m%d'`.tar.bz2 "$DocBackDir"
DocTar=$?
cp -r "$DocTEMPDir"/* "$LocalMountDir"
DocCpCheck=$?
else
echo "$MyPassWord" | sudo -S mount -t ext4 /dev/sda4 "$DocMountPoint"
ReMountCheck=$?
if [ $ReMountCheck -eq '0' ] ; then
tar jcvf "$DocTEMPDir"/DocBackUp`date '+%Y%m%d'`.tar.bz2 "$DocBackDir"
DocTar=$?
cp -r "$DocTEMPDir"/* "$LocalMountDir"
DocCpCheck=$?
DocMountPointCheck=0
else
DocMountPointCheck=1
fi

fi
if [ $DocMountPointCheck -eq '0' -a $DocTar -eq '0' -a $DocCpCheck -eq '0' ]; then

echo "`date '+%Y%m%d'` Doc備份作業完成~~~" >> $LogFile
else
echo "`date '+%Y%m%d'` Doc備份作業未完成!!!!" >> $LogFile
fi

#刪除暫存目錄
rm -rf $TEMPDir
#刪除遠端備份目錄中三天前的備份檔
find ""$LocalMountDir"/" -type f -mtime +3 -exec rm -f {} \;
#確認文件備份目錄是否還掛載著
mount="$DocMountPoint"
DocMountPointCheck=$?
if [ $DocMountPointCheck -eq '0' ] ; then
#卸載遠端備份目錄
echo "$MyPassWord" | sudo -S umount "$DocMountPoint"
fi
#確認備份儲存目錄是否仍掛載
mount | grep "$LocalMountDir" > /dev/null
RemoteHostMountCheck=$?
if [ $RemoteHostMountCheck -eq '0' ] ; then
#卸載遠端備份目錄
echo "$MyPassWord" | sudo -S umount "$LocalMountDir"
fi
echo "`date '+%Y%m%d'` ==== 備份結束時間`date '+%H:%M:%S'`" >> $LogFile
echo "`date '+%Y%m%d'` >>>> 備份作業完成 <<<<<<<<" >> $LogFile
else

echo "`date '+%Y%m%d'` 遠端備份目錄離線中或無法掛載遠端儲存設備,備份作業未開始!!!!"

fi                         

2011年9月19日 星期一

[Bash Script]如果Routing Table 出現兩筆 Default Gateway 怎麼辦?

    因為家裡的動物機群跟一般主機分屬於兩個不同網段同時分別透過兩台IP分享器連網,我在家時為了方便筆電會用有線連『動物機群網段』,同時用無線網卡連到『一般主機網段』。

    可是每次開機時因為同時有兩張網卡(有線+無線)所以就會得到兩個 『DefaultGateway』,有兩個『DefaultGateway』基本上就跟沒有『DefaultGateway』是一樣的,會無法連線,所以老是要手動刪掉『動物機群網段』的『DefaultGateway』,有點煩了所以寫隻簡單的Script讓他自動處理這個問題。

    想法很簡單~~~~

    1. 先檢查看看對接到『動物機群網段』的有線網卡『eth0』是不是『DefaultGateway』,如果是就刪掉。

    2. 接著再檢查對接到『一般主機網段』的無線網卡是不是『DefaultGateway』,如果是,那就....... 沒事~~~,如果不是就加上這個『DefaultGateway』。

    Scritp 如下,

#!/bin/bash 
#
# DefaultGatewayCheck.sh
# 自動設定我要的 Default Gateway
# Version:2.0
# 201109190237
# Max Lin max@mpsstudio.org
# 
 
#!/bin/bash
#
Checketh0=`route -n | grep "UG"| grep "eth0"`
Checkwlan0=`route -n | grep "UG"| grep "wlan0"`

if [ "$Checketh0" ] ; then

    echo '28825252' | sudo -S route del default gw 10.128.0.1                        
fi

if [ ! "$Checkwlan0" ] ; then

    echo '28825252' | sudo -S route add default gw 10.0.0.1

fi




































    測試:

1.檢視現有 Routing Table

max@minako:~$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth0
10.0.0.0        0.0.0.0         255.128.0.0     U     2      0        0 wlan0
10.128.0.0      0.0.0.0         255.128.0.0     U     1      0        0 eth0
0.0.0.0         10.0.0.1        0.0.0.0         UG    0      0        0 wlan0 
 
    沒有『動物機群網段』的『DefaultGateway』
 
2.加上『動物機群網段』的『DefaultGateway』到 Routing Table
 
max@minako:~$ sudo route add default gw 10.128.0.1 
 
3.確認一下
 
max@minako:~$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth0
10.0.0.0        0.0.0.0         255.128.0.0     U     2      0        0 wlan0
10.128.0.0      0.0.0.0         255.128.0.0     U     1      0        0 eth0
0.0.0.0         10.128.0.1      0.0.0.0         UG    0      0        0 eth0
0.0.0.0         10.0.0.1        0.0.0.0         UG    0      0        0 wlan0 
 
  
  『動物機群網段』的『DefaultGateway』在 Routing Table 中 
 
4.執行 Script
 
max@minako:~$ ./CheckGw.sh 
 
5.看一下Routing Table
 
max@minako:~$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth0
10.0.0.0        0.0.0.0         255.128.0.0     U     2      0        0 wlan0
10.128.0.0      0.0.0.0         255.128.0.0     U     1      0        0 eth0
0.0.0.0         10.0.0.1        0.0.0.0         UG    0      0        0 wlan0
 
 『動物機群網段』的『Default Gateway』沒了
 
6.刪掉『一般主機網段』的『Default Gateway』
max@minako:~$ sudo route del default gw 10.0.0.1
 
max@minako:~$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth0
10.0.0.0        0.0.0.0         255.128.0.0     U     2      0        0 wlan0
10.128.0.0      0.0.0.0         255.128.0.0     U     1      0        0 eth0
 
一筆『Default Gateway』都沒有
 
7.再跑一下Script 
 
max@minako:~$ ./CheckGw.sh 
max@minako:~$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth0
10.0.0.0        0.0.0.0         255.128.0.0     U     2      0        0 wlan0
10.128.0.0      0.0.0.0         255.128.0.0     U     1      0        0 eth0
0.0.0.0         10.0.0.1        0.0.0.0         UG    0      0        0 wlan0
 
 
嗯.....有效
 
Powered By Blogger