如何检索网络设备的网络掩码(最好在Linux中,但如果它是跨平台的那么酷)?我知道如何在Linux上使用C但我无法在Python中找到一种方法 - 或许可以减去ctypes。那或解析ifconfig。还有别的吗?
ioctl(socknr, SIOCGIFNETMASK, &ifreq) // C version
答案 0 :(得分:8)
This适用于Linux上的Python 2.2:
iface = "eth0"
socket.inet_ntoa(fcntl.ioctl(socket.socket(socket.AF_INET, socket.SOCK_DGRAM), 35099, struct.pack('256s', iface))[20:24])
答案 1 :(得分:4)
你看到了吗?
http://docs.python.org/library/fcntl.html
这适用于Linux上的python 2.5.2。在完成它的时候了奔前方,但仍这里有云(悲伤浪费精力:-)):
vinko@parrot:~$ 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])
vinko@parrot:~$ python get_netmask.py lo
255.0.0.0
vinko@parrot:~$ python get_netmask.py eth0
255.255.255.0
答案 2 :(得分:2)
您可以使用此库:http://github.com/rlisagor/pynetlinux。注意:我是图书馆的作者。
答案 3 :(得分:2)
我有理由依靠子进程使用简单的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()
使用与网络的套接字连接并使用getsockname()[0]
答案 4 :(得分:2)
netifaces
模块在这里值得一提。直接来自文档:
>>> netifaces.interfaces()
['lo0', 'gif0', 'stf0', 'en0', 'en1', 'fw0']
>>> addrs = netifaces.ifaddresses('en0')
>>> addrs[netifaces.AF_INET]
[{'broadcast': '10.15.255.255', 'netmask': '255.240.0.0', 'addr': '10.0.1.4'}, {'broadcast': '192.168.0.255', 'addr': '192.168.0.47'}]
可在Windows,Linux,OS X以及可能的其他UNIX上运行。
答案 5 :(得分:1)
在Windows中,这段代码可能很有用:
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()
从 HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ NetworkCards 注册表项获取网络适配器列表,然后从 HKLM \ SYSTEM \ ControlSet001 \ Services {adapter_guid中提取有关每个适配器的更多信息} \ Parameters \ Tcpip 键。
我在带有2个虚拟适配器的Windows XP上测试它,它运行正常。应该在2000,2003,Vista也可以。
答案 6 :(得分: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
答案 7 :(得分:0)
来自文档
ipaddress 提供了在IPv4和IPv6地址和网络上创建,操作和操作的功能。
该模块中的功能和类使处理IP地址相关的各种任务变得简单 ...
>>> import socket
>>> import ipaddress
>>>
>>> ip_addr = socket.gethostbyname(socket.gethostname())
>>> netmask = ipaddress.IPv4Network(ip_addr).netmask
>>> print(netmask)
255.255.255.255
>>> ...
这个问题可能会得到解答here。这不是一个相同的问题,但可以为您的问题提供解决方案。