【问题标题】:Get subnet from IP address从 IP 地址获取子网
【发布时间】:2018-11-24 19:38:46
【问题描述】:

我正在尝试为我拥有的 IP 地址获取子网。

例如:

1

子网掩码:255.255.255.0

输入:192.178.2.55

输出:192.178.2.0

2

子网掩码:255.255.0.0

输入:192.178.2.55

输出:192.178.0.0

目前,我这样做的方式(对于子网 255.255.255.0)

ip =  '192.178.2.55'
subnet = '.'.join(ip.split('.')[:2]) + '.0.0'
subnet
'192.178.0.0'

我看到 python 有 ipaddress 库。但是我找不到可以完成上述任务的方法。

奖励:由于 ipaddress 支持 IPv4 和 IPv6,如果可以同时使用相同的功能。

【问题讨论】:

    标签: python python-3.x ip-address


    【解决方案1】:

    ipaddress.ip_network 函数可以采用IPv4NetworkIPv6Network 可以采用的任何字符串格式,包括address/mask 格式。

    由于您实际上并没有传递网络地址,而是该网络中设置了主机位的地址,因此您需要使用strict=False

    所以:

    >>> net = ipaddress.ip_network('192.178.2.55/255.255.255.0', strict=False)
    >>> net
    IPv4Network('192.178.2.0/24')
    >>> net.network_address
    IPv4Address('192.178.2.0')
    >>> net.netmask
    IPv4Address('255.255.255.0')
    

    或者,您可以使用ip_interface 并从那里提取网络:

    >>> iface = ipaddress.ip_interface('192.178.2.55/255.255.255.0')
    >>> iface
    IPv4Interface('192.178.2.55/24')
    >>> iface.network
    IPv4Network('192.178.2.0/24')
    >>> iface.netmask
    IPv4Address('255.255.255.0')
    >>> iface.ip
    IPv4Address('192.178.2.55')
    >>> iface.network.network_address
    IPv4Address('192.178.2.0')
    

    您想要两者中的哪一个取决于您想要表达的具体内容。请注意,Interface 类型是 Address 类型的子类,当然它们会记住用于构造它们的原始地址,而 Network 类会记住网络地址;这两者之一通常是决定因素。

    当然,它们都可以与 IPv6 一样工作:

    >>> ipaddress.ip_interface('2001:db8::1000/32')
    IPv6Interface('2001:db8::1000/32')
    >>> ipaddress.ip_interface('2001:db8::1000/32').network.network_address
    IPv6Address('2001:db8::')
    

    【讨论】:

    • 非常适合我的用例。谢谢。
    【解决方案2】:

    subnet 只是一个二进制掩码,必须与 IP 地址按位进行and'ed。你可以自己敷面膜:

    ".".join(map(str, [i & m # Apply the mask
              for i,m in zip(map(int, ip.split(".")),
                             map(int, subnet.split(".")))]))
    #'192.178.2.0'
    

    此解决方案仅适用于 IPv4 地址。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-31
      • 2014-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-28
      • 1970-01-01
      相关资源
      最近更新 更多