Python でローカルのアドレスを取得する

ifconfigの出力をsedでパース — ありえるえりあのようにLinuxだとSocketを叩くことでIPアドレスを取得できます。以下、Pythonで取得するサンプル。

#!/usr/bin/env python
import socket
import fcntl
import sys

def ifconfig(ifname):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    try:
        result = fcntl.ioctl(s.fileno(), 0x8915 #SIOCGIFADDR,
                             (ifname+'\0'*32)[:32])
    except IOError:
        return None

    return socket.inet_ntoa(result[20:24])

if __name__ == '__main__':
    print ifconfig(sys.argv[1])
実行例:
$ python ifconfig.py eth0
192.168.0.1

また、loを省くために元記事ではsedの正規表現を使っているのだけど、D-BUSが使える今時の環境ならば次のように書けます。サブネットマスクやDNSサーバ、デフォルトゲートウェイ、有線か無線かなども取得できます。

#!/usr/bin/env python
import dbus

NM_SERVICE = 'org.freedesktop.NetworkManager'
NM_OPATH   = '/org/freedesktop/NetworkManager'
NM_DSERVICE = "%s.Devices" % NM_SERVICE

def getAllDevices():
    bus = dbus.SystemBus()

    proxy = bus.get_object(NM_SERVICE, NM_OPATH)
    devs = proxy.getDevices(dbus_interface=NM_SERVICE)

    devices = []
    for dev in devs:
        device = bus.get_object(NM_SERVICE, dev)
        devices.append(device.getProperties(NM_DSERVICE))

    return devices

def getDefaultDevice():
    ds = getAllDevices()
    for d in ds:
        if d[10] != '0.0.0.0':
            return d
    
if __name__ == "__main__":
    d = getDefaultDevice()
    print '%s: %s/%s' % (d[1], d[6], d[7])
実行例:
$ python ifconfig2.py
eth0: 192.168.0.1/255.255.255.0


Leave a comment


:

:

:

:

このエントリーのはてなブックマーク (-)