2009-06-01 82 views
4

如何获取网络设备的网络掩码(在Linux中最好,但如果它是跨平台,那么很酷)?我知道如何在Linux上的C,但我不能在Python中找到一种方法 - 减去ctypes也许。这或解析ifconfig。任何其他方式?在Python中检索网络掩码

ioctl(socknr, SIOCGIFNETMASK, &ifreq) // C version 

回答

6

This对我的作品在Python 2.2在Linux上:

iface = "eth0" 
socket.inet_ntoa(fcntl.ioctl(socket.socket(socket.AF_INET, socket.SOCK_DGRAM), 35099, struct.pack('256s', iface))[20:24]) 
+0

谢谢。我正在追求价值。 – Scott 2009-06-01 20:25:07

3

你看这里?

http://docs.python.org/library/fcntl.html

这对我的作品在Python 2.5.2 Linux上。在完成它的时候了奔前方,但仍这里有云(悲伤浪费精力:-)):

[email protected]:~$ more get_netmask.py 
# get_netmask.py by Vinko Vrsalovic 2009 
# Inspired by http://code.activestate.com/recipes/439093/ 
# and http://code.activestate.com/recipes/439094/ 
# Code: 0x891b SIOCGIFNETMASK 

import socket 
import fcntl 
import struct 
import sys 

def get_netmask(ifname): 
     s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
     return socket.inet_ntoa(fcntl.ioctl(s.fileno(), 0x891b, struct.pack('256 
s',ifname))[20:24]) 

if len(sys.argv) == 2: 
     print get_netmask(sys.argv[1]) 
[email protected]:~$ python get_netmask.py lo 
255.0.0.0 
[email protected]:~$ python get_netmask.py eth0 
255.255.255.0 
+0

都能跟得上没有看到一个。甜。谢谢。 – Scott 2009-06-01 20:02:40

1

在Windows这段代码可能是有用的:从HKLM \ SOFTWARE \微软\的Windows NT \ CURRENTVERSION \ NetworkCards记数

 
import os 
import sys 
import _winreg 


def main(): 
    adapter_list_key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, 
     r'SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards') 

    adapter_count = _winreg.QueryInfoKey(adapter_list_key)[0] 

    for i in xrange(adapter_count): 
     sub_key_name = _winreg.EnumKey(adapter_list_key, i) 
     adapter_key = _winreg.OpenKey(adapter_list_key, sub_key_name) 
     (adapter_service_name, _) = _winreg.QueryValueEx(adapter_key, "ServiceName") 
     (description, _) = _winreg.QueryValueEx(adapter_key, "Description") 

     adapter_registry_path = os.path.join(r'SYSTEM\ControlSet001\Services', 
      adapter_service_name, "Parameters", "Tcpip") 
     adapter_service_key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, 
      adapter_registry_path) 
     (subnet_mask, _) = _winreg.QueryValueEx(adapter_service_key, "SubnetMask") 
     (ip_address, _) = _winreg.QueryValueEx(adapter_service_key, "IpAddress") 

     sys.stdout.write("Name: %s\n" % adapter_service_name) 
     sys.stdout.write("Description: %s\n" % description) 
     sys.stdout.write("SubnetMask: %s\n" % subnet_mask) 
     sys.stdout.write("IpAdress: %s\n" % ip_address) 




if __name__ == "__main__": 
    main() 

获取网络适配器列表ry键并从中提取有关每个适配器的更多信息HKLM \ SYSTEM \ ControlSet001 \ Services {adapter_guid} \ Parameters \ Tcpip键。

我使用2个虚拟适配器在Windows XP上测试它,它工作正常。在2000,2003应该工作,Vista也是。

+0

不适用于我在Windows 8上,为参考 – ihm 2013-11-26 01:44:41

1

我的想法是依赖子进程使用简单的ifconfig(Linux)或ipconfig(Windows)请求来检索信息(如果IP已知)。 欢迎评论

WINDOWS

ip = '192.168.1.10' #Example 
proc = subprocess.Popen('ipconfig',stdout=subprocess.PIPE) 
while True: 
    line = proc.stdout.readline() 
    if ip.encode() in line: 
     break 
mask = proc.stdout.readline().rstrip().split(b':')[-1].replace(b' ',b'').decode() 

的类Unix

ip = '192.168.1.10' #Example 
proc = subprocess.Popen('ifconfig',stdout=subprocess.PIPE) 
while True: 
    line = proc.stdout.readline() 
    if ip.encode() in line: 
     break 
mask = line.rstrip().split(b':')[-1].replace(b' ',b'').decode() 

IP使用套接字连接到网络,并使用getsockname()[0]

0

使用Python检索pyroute2库,你可以得到所有的网络元素的属性:

from pyroute2 import IPRoute 
ip = IPRoute() 
info = [{'iface': x['index'], 'addr': x.get_attr('IFA_ADDRESS'), 'mask': x['prefixlen']} for x in ip.get_addr()] 

可以在这里找到更多信息:http://pyroute2.org/pyroute2-0.3.14p4/iproute.html