0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ろうとるがPythonを扱う、、(その24:IPアドレス情報)

Posted at

プラットフォーム共通でIPアドレス情報+αを表示するプログラムをPythonで作成しようとして、結局GiveUp

機器に割り当てられている、IPアドレス、Link Up/Downなどの情報をプラットフォーム共通(ここでは、Linux、Windows、MacOS)のPythonプログラムを作成しようとして、結局のところできずじまい、、、という経緯を記録として残す。

固有モジュール

Windowsでは、「ろうとるがPythonを扱う、、(その11:Python+tkinterにてIPアドレス設定 )」でも使った

を使うと、Windowsから各種情報が取得できる。

Linuxでは

にて、ネットワーク情報が取得できる。

netifaces

何度か利用したことがあり、これを利用できると思った。実行例は下記のとおり(一部、故意に改行)。

>>> import netifaces
>>> netifaces.AF_LINK
17
>>> netifaces.AF_INET
2
>>> netifaces.interfaces()
['lo', 'eth0', 'eth1', 'eth2']
>>> net0 = netifaces.ifaddresses('eth0')
>>> net1 = netifaces.ifaddresses('eth1')
>>> net0
{17: [{'addr': 'XX:XX:XX:d8:13:d9', 'broadcast': 'ff:ff:ff:ff:ff:ff'}],
 2: [{'addr': '192.168.2.53', 'netmask': '255.255.255.0', 'broadcast': '192.168.2.255'}],
 10: [{'addr': 'fe80::YYYY:30d5:cbff:e00e%eth0', 'netmask': 'ffff:ffff:ffff:ffff::/64'}]}
>>> net1
{17: [{'addr': 'XX:XX:XX:37:b5:4b', 'broadcast': 'ff:ff:ff:ff:ff:ff'}]}
>>> net0.get(netifaces.AF_LINK)[0].get('addr')
'XX:XX:XX:d8:13:d9'
>>> net0.get(netifaces.AF_INET)[0].get('addr')
'192.168.2.53'
>>> net1.get(netifaces.AF_LINK)[0].get('addr')
'XX:XX:XX:37:b5:4b'

'eth0'にはLANケーブルが接続されており、'eth1'には接続されていない。AF_INET有無で、Link Up/Downがわかると判断。これらから、下記コードを作成。

from tabulate import *
import netifaces

headers = ['I/F', 'Mac address', 'IP address', 'Netmask', 'Broadcast', 'Status']
IFtable = {}

for key in headers:
    IFtable[key] = []

for ifname in netifaces.interfaces():
    netif = netifaces.ifaddresses(ifname)
    if netifaces.AF_LINK in netif:
        IFtable[headers[0]].append(ifname)
        macaddr = netif.get(netifaces.AF_LINK)[0].get('addr')
        IFtable[headers[1]].append(macaddr)
        if netifaces.AF_INET in netif:
            ipaddr = netif.get(netifaces.AF_INET)[0].get('addr')
            IFtable[headers[2]].append(ipaddr)
            netmask = netif.get(netifaces.AF_INET)[0].get('netmask')
            IFtable[headers[3]].append(netmask)
            broadcast = netif.get(netifaces.AF_INET)[0].get('broadcast')
            IFtable[headers[4]].append(broadcast)
            IFtable[headers[5]].append('Up')
        else:
            IFtable[headers[2]].append('')
            IFtable[headers[3]].append('')
            IFtable[headers[4]].append('')
            IFtable[headers[5]].append('Down')
print(tabulate(IFtable, headers=headers, tablefmt='fancy_grid'))

AF_INETがあるときは、Link Up、IPアドレスなどを表示、AF_INETがないときは、Link Down、Macアドレスのみを表示している。なお、tabulateを用いて表形式で表示している。これについては、下記参照。

Linuxでの結果

╒═══════╤═══════════════════╤══════════════╤═══════════════╤═══════════════╤══════════╕
│ I/F   │ Mac address       │ IP address   │ Netmask       │ Broadcast     │ Status   │
╞═══════╪═══════════════════╪══════════════╪═══════════════╪═══════════════╪══════════╡
│ lo    │ 00:00:00:00:00:00 │ 127.0.0.1    │ 255.0.0.0     │               │ Up       │
├───────┼───────────────────┼──────────────┼───────────────┼───────────────┼──────────┤
│ eth0  │ XX:XX:XX:d8:13:d9 │ 192.168.2.53 │ 255.255.255.0 │ 192.168.2.255 │ Up       │
├───────┼───────────────────┼──────────────┼───────────────┼───────────────┼──────────┤
│ eth1  │ XX:XX:XX:37:b5:4b │              │               │               │ Down     │
├───────┼───────────────────┼──────────────┼───────────────┼───────────────┼──────────┤
│ eth2  │ XX:XX:XX:d8:13:d9 │              │               │               │ Down     │
╘═══════╧═══════════════════╧══════════════╧═══════════════╧═══════════════╧══════════╛

OK。

Macでの結果

╒═══════════╤═══════════════════╤════════════════╤═══════════════╤════════════════╤══════════╕
│ I/F       │ Mac address       │ IP address     │ Netmask       │ Broadcast      │ Status   │
╞═══════════╪═══════════════════╪════════════════╪═══════════════╪════════════════╪══════════╡
│ en0       │ XX:XX:XX:06:da:b8 │                │               │                │ Down     │
├───────────┼───────────────────┼────────────────┼───────────────┼────────────────┼──────────┤
│ en1       │ XX:XX:XX:b9:c4:44 │ 192.168.10.201 │ 255.255.255.0 │ 192.168.10.255 │ Up       │
├───────────┼───────────────────┼────────────────┼───────────────┼────────────────┼──────────┤
│ p2p0      │ XX:XX:XX:b9:c4:44 │                │               │                │ Down     │
├───────────┼───────────────────┼────────────────┼───────────────┼────────────────┼──────────┤
│ awdl0     │ XX:XX:XX:d4:f8:ff │                │               │                │ Down     │
├───────────┼───────────────────┼────────────────┼───────────────┼────────────────┼──────────┤
│ en2       │ XX:XX:XX:71:59:d0 │                │               │                │ Down     │
├───────────┼───────────────────┼────────────────┼───────────────┼────────────────┼──────────┤
│ en3       │ XX:XX:XX:71:59:d1 │                │               │                │ Down     │
├───────────┼───────────────────┼────────────────┼───────────────┼────────────────┼──────────┤
│ bridge0   │ XX:XX:XX:71:59:d0 │                │               │                │ Down     │
├───────────┼───────────────────┼────────────────┼───────────────┼────────────────┼──────────┤
│ bridge100 │ XX:XX:XX:60:15:64 │ 192.168.2.1    │ 255.255.255.0 │ 192.168.2.255  │ Up       │
╘═══════════╧═══════════════════╧════════════════╧═══════════════╧════════════════╧══════════╛

OK。

Windowsでの結果

╒════════════════════════════════════════╤═══════════════════╤════════════════╤═══════════════╤═════════════════╤══════════╕
│ I/F                                    │ Mac address       │ IP address     │ Netmask       │ Broadcast       │ Status   │
╞════════════════════════════════════════╪═══════════════════╪════════════════╪═══════════════╪═════════════════╪══════════╡
│ {1C20D698-D1CB-4F16-A297-FDCF07852266} │ XX:XX:XX:e7:4d:42 │                │               │                 │ Down     │
├────────────────────────────────────────┼───────────────────┼────────────────┼───────────────┼─────────────────┼──────────┤
│ {EAC691BF-3B4A-4BB4-9D76-03D5AF486FE3} │ XX:XX:XX:8a:51:8e │                │               │                 │ Down     │
├────────────────────────────────────────┼───────────────────┼────────────────┼───────────────┼─────────────────┼──────────┤
│ {8EA4950F-0DED-4187-9499-2347980DAEA4} │ XX:XX:XX:8a:51:8f │                │               │                 │ Down     │
├────────────────────────────────────────┼───────────────────┼────────────────┼───────────────┼─────────────────┼──────────┤
│ {F99FE886-BC25-4909-8C8B-F0177F2BC3C9} │ XX:XX:XX:70:8d:fc │ 172.26.208.1   │ 255.255.240.0 │ 172.26.223.255  │ Up       │
├────────────────────────────────────────┼───────────────────┼────────────────┼───────────────┼─────────────────┼──────────┤
│ {22436D02-C2EE-4ED1-B370-ED48B78DDFDB} │ XX:XX:XX:00:00:08 │ 192.168.56.1   │ 255.255.255.0 │ 192.168.56.255  │ Up       │
├────────────────────────────────────────┼───────────────────┼────────────────┼───────────────┼─────────────────┼──────────┤
│ {D23B393F-9FB4-430F-83AB-4FD4A3DEEC75} │ XX:XX:XX:00:00:21 │ 192.168.219.1  │ 255.255.255.0 │ 192.168.219.255 │ Up       │
├────────────────────────────────────────┼───────────────────┼────────────────┼───────────────┼─────────────────┼──────────┤
│ {9E21F708-247C-4A54-B478-1F8299119C49} │ XX:XX:XX:08:54:81 │ 192.168.2.29   │ 255.255.255.0 │ 192.168.2.255   │ Up       │
├────────────────────────────────────────┼───────────────────┼────────────────┼───────────────┼─────────────────┼──────────┤
│ {E282A14A-88F9-4C2D-A4A4-46C2247D1E9A} │ XX:XX:XX:e5:e4:13 │                │               │                 │ Down     │
├────────────────────────────────────────┼───────────────────┼────────────────┼───────────────┼─────────────────┼──────────┤
│ {C9F3F5FC-7ED5-40F1-8E98-09D17B856B8A} │ XX:XX:XX:e5:e4:12 │                │               │                 │ Down     │
├────────────────────────────────────────┼───────────────────┼────────────────┼───────────────┼─────────────────┼──────────┤
│ {833539D9-7F84-48C1-B648-2B744509569C} │ XX:XX:XX:c0:00:01 │ 192.168.42.1   │ 255.255.255.0 │ 192.168.42.255  │ Up       │
├────────────────────────────────────────┼───────────────────┼────────────────┼───────────────┼─────────────────┼──────────┤
│ {B37F799C-F960-40F2-8999-AAA4BD4867F6} │ XX:XX:XX:c0:00:08 │ 192.168.59.1   │ 255.255.255.0 │ 192.168.59.255  │ Up       │
├────────────────────────────────────────┼───────────────────┼────────────────┼───────────────┼─────────────────┼──────────┤
│ {60DC4B5F-78DF-4263-BFBA-3AD2F6FEB2E6} │ XX:XX:XX:e5:e4:12 │ 192.168.10.202 │ 255.255.255.0 │ 192.168.10.255  │ Up       │
├────────────────────────────────────────┼───────────────────┼────────────────┼───────────────┼─────────────────┼──────────┤
│ {B79DBB08-3C12-4AD2-A20F-500094C3F10A} │ XX:XX:XX:e5:e4:16 │                │               │                 │ Down     │
├────────────────────────────────────────┼───────────────────┼────────────────┼───────────────┼─────────────────┼──────────┤
│ {03F3FF20-EBD5-11E7-81CC-806E6F6E6963} │                   │ 127.0.0.1      │ 255.0.0.0     │ 127.255.255.255 │ Up       │
╘════════════════════════════════════════╧═══════════════════╧════════════════╧═══════════════╧═════════════════╧══════════╛

I/F名がWindows特有のIDのようなものになっており、「イーサネット」など具体名が見えない。

どうにかならないかと思い、トライを続ける。

psutil

psutilは、OS周りの情報を扱うモジュール。実行例は下記のとおり(一部、故意に改行かつ情報割愛)。

>>> import psutil
>>> netif = psutil.net_if_addrs()
>>> netif
{'lo': [snicaddr(family=<AddressFamily.AF_INET: 2>,
address='127.0.0.1', netmask='255.0.0.0', broadcast=None, ptp=None), 
...
'eth0': [snicaddr(family=<AddressFamily.AF_INET: 2>, address='192.168.2.53', netmask='255.255.255.0', broadcast='192.168.2.255', ptp=None), 
...
],
...
}
>>> netif['eth1']
[snicaddr(family=<AddressFamily.AF_PACKET: 17>,
address='c2:ec:03:37:b5:4b', netmask=None, broadcast='ff:ff:ff:ff:ff:ff', ptp=None)]
>>> netif['eth0']
[snicaddr(family=<AddressFamily.AF_INET: 2>,
address='192.168.2.53', netmask='255.255.255.0', broadcast='192.168.2.255', ptp=None),
...
snicaddr(family=<AddressFamily.AF_PACKET: 17>,
address='12:50:3d:d8:13:d9', netmask=None, broadcast='ff:ff:ff:ff:ff:ff', ptp=None)]

'eth0'にはLANケーブルが接続されており、'eth1'には接続されていない。AF_INET有無で、Link Up/Downがわかると判断。また、LinuxでのAF_PACKETは、MacおよびWindowsではAF_LINKで相当するようであった。これらから、下記コードを作成。

import psutil
from tabulate import *

### Table (Dictionary) ###

IFtable = {}
header = ['I/F', 'Mac address', 'IP address', 'Netmask', 'Broadcast', 'Status']

### Network Interface ###

for key in header:
    IFtable[key] = []

AllIFs = psutil.net_if_addrs()
for IFname, IFinfo in AllIFs.items():
    Found_Link = 0
    Found_Inet = 0
    for data in IFinfo:
        if data.family.name == 'AF_LINK' or data.family.name == 'AF_PACKET':
            Found_Link = 1
            macaddr = data.address
        if data.family.name == 'AF_INET':
            Found_Inet = 1
            ipaddr = data.address
            netmask = data.netmask
            broadcast = data.broadcast
    if Found_Link == 1:
        IFtable[header[0]].append(IFname)
        IFtable[header[1]].append(macaddr)
        if Found_Inet == 1:
            IFtable[header[2]].append(ipaddr)
            IFtable[header[3]].append(netmask)
            IFtable[header[4]].append(broadcast)
            IFtable[header[5]].append('Up')
        else:
            IFtable[header[2]].append('')
            IFtable[header[3]].append('')
            IFtable[header[4]].append('')
            IFtable[header[5]].append('Down')

print(tabulate(IFtable, headers=header, tablefmt='fancy_grid'))

Linuxでの結果

╒═══════╤═══════════════════╤══════════════╤═══════════════╤═══════════════╤══════════╕
│ I/F   │ Mac address       │ IP address   │ Netmask       │ Broadcast     │ Status   │
╞═══════╪═══════════════════╪══════════════╪═══════════════╪═══════════════╪══════════╡
│ lo    │ 00:00:00:00:00:00 │ 127.0.0.1    │ 255.0.0.0     │               │ Up       │
├───────┼───────────────────┼──────────────┼───────────────┼───────────────┼──────────┤
│ eth0  │ XX:XX:XX:d8:13:d9 │ 192.168.2.53 │ 255.255.255.0 │ 192.168.2.255 │ Up       │
├───────┼───────────────────┼──────────────┼───────────────┼───────────────┼──────────┤
│ eth1  │ XX:XX:XX:37:b5:4b │              │               │               │ Down     │
├───────┼───────────────────┼──────────────┼───────────────┼───────────────┼──────────┤
│ eth2  │ XX:XX:XX:d8:13:d9 │              │               │               │ Down     │
╘═══════╧═══════════════════╧══════════════╧═══════════════╧═══════════════╧══════════╛

OK。

Macでの結果

╒═══════════╤═══════════════════╤════════════════╤═══════════════╤═════════════════╤══════════╕
│ I/F       │ Mac address       │ IP address     │ Netmask       │ Broadcast       │ Status   │
╞═══════════╪═══════════════════╪════════════════╪═══════════════╪═════════════════╪══════════╡
│ en0       │ XX:XX:XX:06:da:b8 │ 169.254.164.57 │ 255.255.0.0   │ 169.254.255.255 │ Up       │
├───────────┼───────────────────┼────────────────┼───────────────┼─────────────────┼──────────┤
│ en1       │ XX:XX:XX:b9:c4:44 │ 192.168.10.201 │ 255.255.255.0 │ 192.168.10.255  │ Up       │
├───────────┼───────────────────┼────────────────┼───────────────┼─────────────────┼──────────┤
│ bridge100 │ XX:XX:XX:60:15:64 │ 192.168.2.1    │ 255.255.255.0 │ 192.168.2.255   │ Up       │
├───────────┼───────────────────┼────────────────┼───────────────┼─────────────────┼──────────┤
│ p2p0      │ XX:XX:XX:b9:c4:44 │                │               │                 │ Down     │
├───────────┼───────────────────┼────────────────┼───────────────┼─────────────────┼──────────┤
│ awdl0     │ XX:XX:XX:5f:14:d5 │                │               │                 │ Down     │
├───────────┼───────────────────┼────────────────┼───────────────┼─────────────────┼──────────┤
│ en2       │ XX:XX:XX:71:59:d0 │                │               │                 │ Down     │
├───────────┼───────────────────┼────────────────┼───────────────┼─────────────────┼──────────┤
│ en3       │ XX:XX:XX:71:59:d1 │                │               │                 │ Down     │
├───────────┼───────────────────┼────────────────┼───────────────┼─────────────────┼──────────┤
│ bridge0   │ XX:XX:XX:71:59:d0 │                │               │                 │ Down     │
╘═══════════╧═══════════════════╧════════════════╧═══════════════╧═════════════════╧══════════╛

OK。

Windowsでの結果

╒═══════════════════════════════╤═══════════════════╤═════════════════╤═══════════════╤═════════════╤══════════╕
│ I/F                           │ Mac address       │ IP address      │ Netmask       │ Broadcast   │ Status   │
╞═══════════════════════════════╪═══════════════════╪═════════════════╪═══════════════╪═════════════╪══════════╡
│ VPN - VPN Client              │ XX-XX-XX-E7-4D-42 │ 169.254.19.210  │ 255.255.0.0   │             │ Up       │
├───────────────────────────────┼───────────────────┼─────────────────┼───────────────┼─────────────┼──────────┤
│ イーサネット 3                  │ XX-XX-XX-8A-51-8E │ 169.254.240.119 │ 255.255.0.0   │             │ Up       │
├───────────────────────────────┼───────────────────┼─────────────────┼───────────────┼─────────────┼──────────┤
│ イーサネット 4                  │ XX-XX-XX-8A-51-8F │ 169.254.55.16   │ 255.255.0.0   │             │ Up       │
├───────────────────────────────┼───────────────────┼─────────────────┼───────────────┼─────────────┼──────────┤
│ vEthernet (WSL)               │ XX-XX-XX-70-8D-FC │ 172.26.208.1    │ 255.255.240.0 │             │ Up       │
├───────────────────────────────┼───────────────────┼─────────────────┼───────────────┼─────────────┼──────────┤
│ イーサネット 6                  │ XX-XX-XX-00-00-08 │ 192.168.56.1    │ 255.255.255.0 │             │ Up       │
├───────────────────────────────┼───────────────────┼─────────────────┼───────────────┼─────────────┼──────────┤
│ イーサネット 7                  │ XX-XX-XX-00-00-21 │ 192.168.219.1   │ 255.255.255.0 │             │ Up       │
├───────────────────────────────┼───────────────────┼─────────────────┼───────────────┼─────────────┼──────────┤
│ イーサネット 11                 │ XX-XX-XX-08-54-81 │ 192.168.2.29    │ 255.255.255.0 │             │ Up       │
├───────────────────────────────┼───────────────────┼─────────────────┼───────────────┼─────────────┼──────────┤
│ ローカル エリア接続* 2           │ XX-XX-XX-E5-E4-13 │ 169.254.7.211   │ 255.255.0.0   │             │ Up       │
├───────────────────────────────┼───────────────────┼─────────────────┼───────────────┼─────────────┼──────────┤
│ ローカル エリア接続* 3           │ XX-XX-XX-E5-E4-12 │ 169.254.137.203 │ 255.255.0.0   │             │ Up       │
├───────────────────────────────┼───────────────────┼─────────────────┼───────────────┼─────────────┼──────────┤
│ VMware Network Adapter VMnet1 │ XX-XX-XX-C0-00-01 │ 192.168.42.1    │ 255.255.255.0 │             │ Up       │
├───────────────────────────────┼───────────────────┼─────────────────┼───────────────┼─────────────┼──────────┤
│ VMware Network Adapter VMnet8 │ XX-XX-XX-C0-00-08 │ 192.168.59.1    │ 255.255.255.0 │             │ Up       │
├───────────────────────────────┼───────────────────┼─────────────────┼───────────────┼─────────────┼──────────┤
│ Wi-Fi 5                       │ XX-XX-XX-E5-E4-12 │ 192.168.10.202  │ 255.255.255.0 │             │ Up       │
├───────────────────────────────┼───────────────────┼─────────────────┼───────────────┼─────────────┼──────────┤
│ Bluetooth ネットワーク接続 3     │ XX-XX-XX-E5-E4-16 │ 169.254.224.155 │ 255.255.0.0   │             │ Up       │
╘═══════════════════════════════╧═══════════════════╧═════════════════╧═══════════════╧═════════════╧══════════╛

I/F名は正しく表示されるが、Broadcastアドレスが取得できない、LANケーブル未接続でも、Link Up表示されてしまった。

Link Up/Downについて

psutil.net_if_stats()にて、I/F情報が取得できる。

Linux

>>> netstat = psutil.net_if_stats()
>>> netstat
{'lo': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=0, mtu=65536), 'eth0': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=1000, mtu=1500), 'eth1': snicstats(isup=False, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=65535, mtu=1500), 'eth2': snicstats(isup=False, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=65535, mtu=1500)}
>>> netstat['eth0']
snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=1000, mtu=1500)
>>> netstat['eth1']
snicstats(isup=False, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=65535, mtu=1500)
  • 'eth0':LANケーブル接続 → speed=1000
  • 'eth1':LANケーブル未接続 → speed=65535

Mac

>>> netstat['en0']
snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=1000, mtu=1500, flags='up,broadcast,notrailers,running,promisc,multicast,simplex')
>>> netstat['en1']
snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=0, mtu=1500, flags='up,broadcast,notrailers,running,multicast,simplex')
>>> netstat['en2']
snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=0, mtu=1500, flags='up,broadcast,notrailers,running,promisc,multicast,simplex')
  • 'en0':LANケーブル接続 → speed=1000
  • 'en1':WiFi接続 → speed=0
  • 'en2':LANケーブル未接続 → speed=0

Windows

>>> netstat['イーサネット 11']
snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=1000, mtu=1500, flags='')
>>> netstat['イーサネット 3']
snicstats(isup=False, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=0, mtu=1500, flags='')
>>> netstat['Wi-Fi 5']
snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=866, mtu=1500, flags='')
  • 'イーサネット 11':LANケーブル接続 → speed=1000
  • 'イーサネット 3':LANケーブル未接続 → speed=0
  • 'Wi-Fi 5':WiFi接続 → speed=866

単純には共通化できず、、、

LANケーブル接続時には数値(ここでは1000Mbps)が共通のようだが、未接続時には”0”と”65535”とがあり、WiFi接続時には”0”と”866”とがある。

結論(みたいなもの)

OS情報を取得して、OSごとに取得方法を変えるしかないか、、。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?