python獲取linux和windows系統(tǒng)指定接口的IP地址的步驟及代碼
實驗?zāi)康模?/h3>
用戶輸入網(wǎng)卡名稱,通過函數(shù)返回對應(yīng)的IPv4和IPv6地址。
實驗代碼:
步驟一: 由于window系統(tǒng)下網(wǎng)卡名稱并不是真正的名字,而真正的ID在注冊表SYSTEM\CurrentControlSet\Control\Network{4d36e972-e325-11ce-bfc1-08002be10318}目錄下。所以需要通過如下代碼,返回接口名稱和唯一ID的對應(yīng)關(guān)系。

win_ifname.py:
import netifaces as ni
# import winreg as wr
# 將windows下的接口的名稱和唯一ID一一對應(yīng)存入字典并返回
def get_connection_name_from_guid(iface_guids):
wr = __import__('winreg', globals(), locals(), ['wr'])
iface_dict = {}
reg = wr.ConnectRegistry(None, wr.HKEY_LOCAL_MACHINE)
reg_key = wr.OpenKey(reg, r'SYSTEM\CurrentControlSet\Control\Network\{4d36e972-e325-11ce-bfc1-08002be10318}')
for i in iface_guids:
try:
reg_subkey = wr.OpenKey(reg_key, i + r'\Connection')
iface_dict[wr.QueryValueEx(reg_subkey, 'Name')[0]] = i
except FileNotFoundError:
pass
return iface_dict
# 根據(jù)輸入的接口名稱,返回唯一ID
def win_from_name_get_id(ifname):
x = ni.interfaces()
return get_connection_name_from_guid(x).get(ifname)
if __name__ == '__main__':
import platform
if platform.system() == "Windows":
print(win_from_name_get_id("WLAN"))
運行結(jié)果:

可以看到獲取WLAN接口的ID和注冊表中查看的一致。
步驟二: 通過接口名稱(linux)或者接口ID(windows)找到IPv4和IPv6地址。
from netifaces import ifaddresses, AF_INET, AF_INET6
import platform
# 獲取接口IPv4地址
def get_ip_address(ifname):
if platform.system() == "Linux":
try:
# AF_INET表示的是IPv4地址(AF_LINK則表示的是MAC地址)
return ifaddresses(ifname)[AF_INET][0]['addr']
except ValueError:
return None
elif platform.system() == "Windows":
# 需要首先調(diào)用win_from_name_get_id函數(shù),獲取接口的ID
from win_ifname import win_from_name_get_id
if_id = win_from_name_get_id(ifname)
if not if_id:
return
else:
return ifaddresses(if_id)[AF_INET][0]['addr']
else:
print('操作系統(tǒng)不支持,本腳本只能工作在Windows或者Linux環(huán)境!')
# 獲取接口IPv6地址,和IPv4同理
def get_ipv6_address(ifname):
if platform.system() == "Linux":
try:
return ifaddresses(ifname)[AF_INET6][0]['addr']
except ValueError:
return None
elif platform.system() == "Windows":
from win_ifname import win_from_name_get_id
if_id = win_from_name_get_id(ifname)
if not if_id:
return
else:
# 此處依然要提供WIN的網(wǎng)卡ID, 而不是名字
return ifaddresses(if_id)[AF_INET6][0]['addr']
else:
print('操作系統(tǒng)不支持,本腳本只能工作在Windows或者Linux環(huán)境!')
if __name__ == "__main__":
if platform.system() == "Linux":
print(get_ip_address('ens33'))
print(get_ipv6_address('ens33'))
elif platform.system() == "Windows":
print(get_ip_address('WLAN'))
print(get_ipv6_address('WLAN'))
測試結(jié)果:
windows平臺下:

Linux平臺下:

到此這篇關(guān)于python獲取linux和windows系統(tǒng)指定接口的IP地址的文章就介紹到這了,更多相關(guān)python獲取接口ip地址內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python3的UnicodeDecodeError解決方法
這篇文章主要介紹了python3的UnicodeDecodeError解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
Python win32com 操作Exce的l簡單方法(必看)
下面小編就為大家?guī)硪黄狿ython win32com 操作Exce的l簡單方法(必看)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05
python?plotly設(shè)置go.Scatter為實線實例
這篇文章主要為大家介紹了python?plotly設(shè)置go.Scatter為實線線條的樣式實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
WIn10+Anaconda環(huán)境下安裝PyTorch(避坑指南)
這篇文章主要介紹了WIn10+Anaconda環(huán)境下安裝PyTorch(避坑指南),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-01-01
django與vue的完美結(jié)合_實現(xiàn)前后端的分離開發(fā)之后在整合的方法
今天小編就為大家分享一篇django與vue的完美結(jié)合_實現(xiàn)前后端的分離開發(fā)之后在整合的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08

