【问题标题】:Compare IP List to another IP List or IP Range将 IP 列表与另一个 IP 列表或 IP 范围进行比较
【发布时间】:2017-03-04 06:26:15
【问题描述】:

我创建了一个扫描 IP 范围(即 x.y.z.0/24)并返回在线主机列表的 Python 项目。它将在线主机列表保存到仅包含 ip 的文件(即 ['192.168.0.1', '192.168.0.2', '192.168.0.8',...]。我在下一步遇到问题。我'我想将此在线主机列表与 IP 范围进行比较,以验证这些是计算机以消除其他设备。我有一个我可以使用的计算机的 DHCP 保留列表。有没有一种简单的方法来执行此操作并更新 onHosts 列表?

【问题讨论】:

  • 将ips转换为int,将iprange转换为位掩码,查看ip是否在该位掩码内。
  • 任何示例都会有所帮助和赞赏。

标签: python list networking ip-address python-3.5


【解决方案1】:

这是您可以尝试的建议解决方案(它有点臃肿,但希望稍后我会编辑它)

def get_range(str_num):
    """ Converts string representation of number or range into (min,max) tuple """
    try:
        num = int(str_num)
        return num, num
    except ValueError:
        min_, max_ = str_num.split('-')
        return int(min_), int(max_)

def host_in_range(host, host_range):
    """ Checks whether given host belongs to given range (both are range representation """
    #print(*zip(host, host_range))
    for (min_h, max_h), (min_r, max_r) in zip(host, host_range):
        if (min_h < min_r) or (max_h > max_r): return False
    return True


if __name__ == "__main__":

    hosts_str = ['192.168.0.1', '192.168.0.10', '0.168.0.0', '192.168.1.10', '192.168.0.255']
    hosts = [x.split('.') for x in hosts_str]
    hosts = [[get_range(x) for x in elem] for elem in hosts]

    host_ranges_str = ['0-255.168.0.0-254', '192.168.2-5.0-255']
    host_ranges = [x.split('.') for x in host_ranges_str]
    host_ranges = [[get_range(x) for x in elem] for elem in host_ranges]

    for x in range(5):
        print(hosts_str[x], "in range", host_ranges_str[0], host_in_range(hosts[x], host_ranges[0]))

【讨论】:

  • 感谢您的信息。让我试试这个,看看会发生什么。我遇到了一种将 IP 字符串转换为 INT 并返回到 ipaddress 模块的简单方法。这使得静态比较相当容易,但我正在创建的程序是基于用户输入的变量。 int(ipaddress.IPv4Address('192.168.0.1')) str(ipaddress.IPv4Address(3232235521))
猜你喜欢
  • 1970-01-01
  • 2013-07-14
  • 1970-01-01
  • 1970-01-01
  • 2020-01-21
  • 2015-08-31
  • 1970-01-01
  • 2015-05-20
  • 2014-09-16
相关资源
最近更新 更多