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









