Python3.10動態修改Windows系統(win10/win11)本地IP地址(靜態IP)

劉悅的技術部落格發表於2023-05-09

一般情況下,區域網裡的終端比如本地伺服器設定靜態IP的好處是可以有效減少網路連線時間,原因是過程中省略了每次聯網後從DHCP伺服器獲取IP地址的流程,缺點是容易引發IP地址的衝突,當然,還有操作層面的繁瑣,如果想要切換靜態IP地址,就得去網路連線設定中手動操作,本次我們使用Python3.10動態地修改電腦的靜態IP地址。

獲取多網路卡配置

一個網路卡對應一個靜態IP地址,但機器上未必只有一個網路卡,所以如果想動態切換,必須要指定網路卡名稱,Win系統中透過ipconfig命令來獲取當前系統的網路卡資訊:

ipconfig

系統返回:

PS C:\Users\liuyue\h2102-a\videopro> ipconfig  
  
Windows IP 配置  
  
  
乙太網介面卡 乙太網:  
  
   連線特定的 DNS 字尾 . . . . . . . :  
   本地連結 IPv6 地址. . . . . . . . : fe80::a216:f22a:52a:3388%4  
   IPv4 地址 . . . . . . . . . . . . : 192.168.1.104  
   子網掩碼  . . . . . . . . . . . . : 255.255.255.0  
   預設閘道器. . . . . . . . . . . . . : 192.168.1.1  
  
乙太網介面卡 乙太網 2:  
  
   連線特定的 DNS 字尾 . . . . . . . :  
   IPv6 地址 . . . . . . . . . . . . : fdb2:2c26:f4e4:0:7703:1e08:e622:2f0  
   臨時 IPv6 地址. . . . . . . . . . : fdb2:2c26:f4e4:0:717c:b59e:b6cd:51b2  
   本地連結 IPv6 地址. . . . . . . . : fe80::2645:f265:ad72:c751%16  
   IPv4 地址 . . . . . . . . . . . . : 192.168.0.118  
   子網掩碼  . . . . . . . . . . . . : 255.255.255.0  
   預設閘道器. . . . . . . . . . . . . :  
  
乙太網介面卡 vEthernet (Default Switch):  
  
   連線特定的 DNS 字尾 . . . . . . . :  
   本地連結 IPv6 地址. . . . . . . . : fe80::3ece:9b38:2572:4e33%18  
   IPv4 地址 . . . . . . . . . . . . : 172.31.16.1  
   子網掩碼  . . . . . . . . . . . . : 255.255.240.0  
   預設閘道器. . . . . . . . . . . . . :

如果想透過Python來獲取網路卡資訊,則需要在指令碼中執行ipconfig命令,構建change_ip.py指令碼:

import os,re  
  
class IpManage:  
  
    def __init__(self):  
  
        self.ip_list = self.get_ip()  
  
  
    def get_ip(self):  
  
  
        result = os.popen('ipconfig')  
        res = result.read()  
  
        resultlist = re.findall('''(?<=乙太網介面卡 ).*?(?=:)|(?<=無線區域網介面卡 ).*?(?=:)''', res)  
  
        print(resultlist)  
  
        return resultlist  
  
if __name__ == '__main__':  
      
    IpManage()

這裡透過os模組的popen方法來執行ipconfig命令,隨後再使用正則來匹配網路卡名稱,最後將匹配到的網路卡列表賦值給例項屬性,程式返回:

['乙太網', '乙太網 2', 'vEthernet (Default Switch)']  
[Finished in 394ms]

至此,三塊網路卡的名稱就獲取到了。

動態切換靜態IP

接下來就是透過Python指令碼來動態切換指定網路卡的靜態IP地址了,Windows系統透過netsh命令來指定IP地址:

netsh interface ip set address name=乙太網 static 192.168.201.137 255.255.248.0 192.168.200.1

這裡name引數是網路卡名稱,後來三個地址分別代表靜態IP地址,子網掩碼以及閘道器地址。

這裡將第一塊網路卡的靜態IP地址設定為192.168.201.137,子網掩碼是255.255.248.0,閘道器地址為192.168.200.1。

隨後在Windows的網路連線設定中進行檢視:

發現已經設定好了,隨後再手動修改為自動獲得IP地址選項。

下面透過Python指令碼進行設定:

def set_ip(self,name,ip="192.168.201.137",mask="255.255.248.0",gateway="192.168.200.1"):  
  
        result = os.popen(f"netsh interface ip set address name={name} static {ip} {mask} {gateway}")  
        res = result.read()  
  
        print(res)

這裡新增一個例項方法來設定ip地址,同樣使用popen方法來執行命令,隨後進行呼叫:

if __name__ == '__main__':  
      
    im = IpManage()  
  
    im.set_ip(im.ip_list[0])

這裡將第一塊網路卡的IP地址進行指定操作。

完整程式碼:

import os,re  
  
class IpManage:  
  
    def __init__(self):  
  
        self.ip_list = self.get_ip()  
  
  
    def set_ip(self,name,ip="192.168.201.137",mask="255.255.248.0",gateway="192.168.200.1"):  
  
        result = os.popen(f"netsh interface ip set address name={name} static {ip} {mask} {gateway}")  
        res = result.read()  
  
  
  
    def get_ip(self):  
  
  
        result = os.popen('ipconfig')  
        res = result.read()  
  
        resultlist = re.findall('''(?<=乙太網介面卡 ).*?(?=:)|(?<=無線區域網介面卡 ).*?(?=:)''', res)  
  
        print(resultlist)  
  
        return resultlist  
  
if __name__ == '__main__':  
      
    im = IpManage()  
  
    im.set_ip(im.ip_list[0])

結語

藉此,我們就可以透過Python3.10動態地配置本地網路卡的靜態IP地址,也可以理解為是一種Python自動化流程,靜態IP地址可以讓IP地址語義化,對於資料中心、網站、銀行的結算埠等往往需要靜態IP,與此同時,也省卻了手動配置靜態IP的繁瑣過程。

相關文章