在我的Python脚本中,我需要检索运行脚本的机器的IP地址及其网络地址和网络字节。
至于IP地址,我在档案中找到了解决方案:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("www.google.com",80))
myAddress = (s.getsockname()[0])
s.close()
但是我应该如何寻找网络地址和网络字节?我需要以$NetworkAddress/$NetworkBytes
格式将此信息放入tcpdump的过滤器中,如果这有用的话。
示例:
128.1.2.0/20
当我运行inet
时,我实际上可以在ip addr
下找到它。有什么简单的方法可以在Python中获取这些信息吗?
答案 0 :(得分:14)
对于Linux尝试
iface = "eth0"
socket.inet_ntoa(fcntl.ioctl(socket.socket(socket.AF_INET, socket.SOCK_DGRAM),
35099, struct.pack('256s', iface))[20:24])
或http://github.com/rlisagor/pynetlinux
(如此处所示:Retrieving network mask in Python)
对于Linux,Windows和MacOS考虑http://alastairs-place.net/projects/netifaces/
<强>更新强>
如果您需要cidr(如'128.1.2.0/20'),您可以使用任何相关的库:http://pypi.python.org/pypi?%3Aaction=search&term=cidr&submit=search
例如netaddr
:
>> from netaddr import IPNetwork
>> print str(IPNetwork('1.2.3.4/255.255.255.0').cidr)
1.2.3.0/24
答案 1 :(得分:1)
您可以使用pyroute2模块检索任何与ip相关的信息:
from pyroute2 import IPDB
ip = IPDB()
print(ip.interfaces['em1'].ipaddr)
ip.release()
或作为变体:
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()]
ip.close()