如何获取网络设备的网络掩码(在Linux中最好,但如果它是跨平台,那么很酷)?我知道如何在Linux上的C,但我不能在Python中找到一种方法 - 减去ctypes也许。这或解析ifconfig。任何其他方式?在Python中检索网络掩码
ioctl(socknr, SIOCGIFNETMASK, &ifreq) // C version
如何获取网络设备的网络掩码(在Linux中最好,但如果它是跨平台,那么很酷)?我知道如何在Linux上的C,但我不能在Python中找到一种方法 - 减去ctypes也许。这或解析ifconfig。任何其他方式?在Python中检索网络掩码
ioctl(socknr, SIOCGIFNETMASK, &ifreq) // C version
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])
你看这里?
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
都能跟得上没有看到一个。甜。谢谢。 – Scott 2009-06-01 20:02:40
在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也是。
不适用于我在Windows 8上,为参考 – ihm 2013-11-26 01:44:41
您可以用这个库:http://github.com/rlisagor/pynetlinux。注意:我是图书馆的作者。
我的想法是依赖子进程使用简单的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]
使用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
谢谢。我正在追求价值。 – Scott 2009-06-01 20:25:07