PythonマルチNICのIPアドレスを取得するいくつかの方法(Linuxシステム)

2915 ワード

年を越す前に、元のwindowsツールクライアントをLinuxバージョンに書き換える任務があり、pythonにとって移植しやすい.しかし、重要なステップは、現在のデバイスのipアドレスを取得することです.window版の関数は直接使用できません.
もともととても简単な1件の事、会社の多くの机械のLinuxバージョンが异なっているため、机械のネットカードの数量も异なって、もともと自分の机械のテストが终わって问题がなくて、他の人に持って使うと各种の问题が现れて、适切に配合し终わって、机械を交换してまた新しい问题が现れて、前后に意外にも4つの方法を変えました.
構想はlinuxコマンドの出力結果を取得することによって各ipを解析することにほかならない.多くのコマンドと正規表現の組み合わせを試したことがある.その時の気持ちは本当に泣いたり笑ったりできなかった.ここに記録して、時々の必要に備えてください.
コマンド:
hostname -I

コマンド出力:
202.196.1.0 202.196.1.1
プログラム:
def getIPAddrs(self):
    p = Popen("hostname -I", shell=True, stdout=PIPE)
    data = p.stdout.read() #         
    data = str(data,encoding = 'UTF-8') #            
    ip_list = data.split(' ') #                IP   
    if "
" in ip_list: # ip_list.remove("
") print(ip_list) return ip_list

出力結果:
[202.196.1.0, 202.196.1.1]
以前に使用した方法(Linux):
 def getIPAddrsV2(self):
     p = Popen("ifconfig | grep 'inet ' | grep -v '127.0.0.1' | awk '{print $2}'", shell=True, stdout=PIPE)
     data = p.stdout.read()
     data = str(data,encoding = 'UTF-8')
     ip_list = data.split('
') ip_list.remove("") ip_list2 = [] for ip in ip_list: if ":" in ip: ip_list2.append(ip.split(":")[-1]) else: ip_list2.append(ip) print(ip_list2) return ip_list2 def getIPAddrsV3(self): import psutil netcard_info = [] info = psutil.net_if_addrs() for k, v in info.items(): for item in v: if item[0] == 2 and not item[1] == '127.0.0.1': # netcard_info.append((k, item[1])) netcard_info.append( item[1]) return netcard_info def getIPAddrsV4(self): import fcntl import struct ifname = b'enp0s31f6' # ip_list = [] s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) ip = socket.inet_ntoa(fcntl.ioctl(s.fileno(),0x8915,struct.pack(b'256s', ifname[:15]))[20:24]) ip_list.append(ip) return ip_list

以前に使用した方法(Windows):
'''  pc IPv4  '''
def getIPAddrs(self):
    ip_list = socket.gethostbyname_ex(socket.gethostname())
    for ips in ip_list:
        if type(ips) == list and len(ips) != 0:
            IPlist = ips
    return IPlist

 def getIPAddrsV2(self):
     p = Popen('ipconfig|findstr IPv4', shell=True, stdout=PIPE)
     data = p.stdout.read().decode(encoding='gb2312')
     IPlist = []
     splitlist = re.split('[\r:]', data)
     for eachpart in splitlist:
         if '.' in eachpart and 'IP' not in eachpart:
             IPlist.append(eachpart.strip())
     return IPlist