MAC Changer (三): 修改 MAC 位址(程式優化)

Note: 此教學可應用在大部分的 Linux 作業系統。在執行命令時,必須要有 root 訪問權限才可以成功修改 MAC Address。

前言

本篇文章將繼續修改 MAC Changer 程式,之前已經使用 Python 完成修改 MAC 位址(MAC Address),但程式仍然有改善的地方。本次目標是可以讓程式自動檢測 MAC 位址是否有正確修改,先前我們驗證都是需要額外自己下 ifconfig 指令觀察 MAC 位址是否有修正。

思考

首先可以先思考程式執行的步驟,可以先參考之前實作的程式

  1. 取得使用者傳遞命令行參數
  2. 針對使用者想要修改之介面,執行讀取其 ifconfig 資訊(待實作)
  3. 針對讀取的 ifconfig 資訊,抓取其 MAC 位址資訊(待實作)
  4. 判斷 MAC 位址是否存在,並返回適當訊息(待實作)
  5. 針對使用者想要修改之介面及新的 MAC 位址,執行修改 MAC 位址命令
  6. 最後取得現在的 MAC 位址(步驟2、3、4),並判斷是否有作修改(待實作)

程式優化 – 修改 MAC 位址

開發環境

使用模組(Python 模組)

實作

以下為完整程式碼:

在上述程式中,主要新增了 get_current_mac(interface) 函式,其功能為抓取所提供介面的當前 MAC 位址。

ifconfig_result = subprocess.check_output(["ifconfig", interface])

上面的語句類似於 change_mac() 函式中的 sub.call(),但有一個區別, sub.check_output() 函式返回命令的輸出,而 sub.call() 不返回任何內容。我們可以將 sub.check_output() 返回的輸出儲存在變量 output 中。

官方文件:By default, this function will return the data as encoded bytes. The actual encoding of the output data may depend on the command being invoked, so the decoding to text will often need to be handled at the application level.

透過 sub.check_output() 可以得到下面的回傳資料。接下來只想拿到介面的 MAC address,其他不需要。由於得到的回傳資料為字串,我們可以透過正規表達式(Regular Expression)來實現。

eth0: flags=4163  mtu 1500
     inet 10.0.2.15  netmask 255.255.255.0  broadcast 10.0.2.255     
     inet6 fe80::a00:27ff:fe62:a1c8  prefixlen 64  scopeid 0x20
     
     ether 08:00:27:62:a1:c8  txqueuelen 1000  (Ethernet)     
     RX packets 107  bytes 10867 (10.6 KiB)     
     RX errors 0  dropped 0  overruns 0  frame 0     
     TX packets 133  bytes 11680 (11.4 KiB)     
     TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

所以這邊需要使用 re 模組。 re 代表正則表達式,它們通常在字符串匹配應用程序中使用。re.search() 函式接受正則表達式並在大型的文字堆裡面找到我們需要的文字。在撰寫正規表達式前需要先懂其語法規則,在這邊就不討論。

在程式碼裡,我們可以看到 re.search() 所使用的正規表達式為”\w\w:\w\w:\w\w:\w\w:\w\w:\w\w“,要看其會過濾(Filter)出來的字串,可以使用此網站進行測試,效果如下圖。

此外,re.search() 可能會找到多個與正規表達式(Regular Expression)匹配的字符串。因此,以下語句將會確保只返回第一個匹配的字符串。

mac_address_search_result.group(0)

到此我們就將 get_current_mac(interface) 函式給完成了,接下來只要調用它就可以運作了,詳細再請參照上面程式碼。

程式連結:Github

結語

本篇文章透過正規表達式(Regular Expression)來查詢介面(Interface)是否存在 MAC 位址,並讓程式可以自動檢測 MAC 位址使否有修改成功,並顯示適當的提示文字。

相關文章

Leave a Reply

發佈留言必須填寫的電子郵件地址不會公開。