【问题标题】:python increment ipaddresspython增加ip地址
【发布时间】:2012-03-02 19:12:42
【问题描述】:

我想将一个 IP 地址增加一个固定值。

这正是我想要实现的,我有一个 IP 地址,192.168.0.3,我想将它增加 1,这将导致 192.168.0.4 甚至固定值 x这样它就会将我的IP地址增加该数字。所以,我可以有一个像192.168.0.3+x 这样的主机。

我只想知道是否已经存在任何用于此转换的模块。

我尝试了socket.inet_aton 然后socket.inet_ntoa,但我不知道如何让它正常工作。需要一些帮助或建议。

【问题讨论】:

    标签: python networking


    【解决方案1】:

    在 Python 3 中:

    >>> import ipaddress
    >>> ipaddress.ip_address('192.168.0.4')  # accept both IPv4 and IPv6 addresses
    IPv4Address('192.168.0.4')
    >>> int(_)
    3232235524
    
    >>> ipaddress.ip_address('192.168.0.4') + 256
    IPv4Address('192.168.1.4')
    

    反过来:

    >>> ipaddress.ip_address(3232235524)
    IPv4Address('192.168.0.4')
    >>> str(_)
    '192.168.0.4'
    
    >>> ipaddress.ip_address('192.168.0.4') -1
    IPv4Address('192.168.0.3')
    

    Python 2/3

    您可以使用struct 模块来解压inet_aton() 的结果,例如,

    import struct, socket
    
    # x.x.x.x string -> integer
    ip2int = lambda ipstr: struct.unpack('!I', socket.inet_aton(ipstr))[0]
    print(ip2int("192.168.0.4"))
    # -> 3232235524
    

    反过来:

    int2ip = lambda n: socket.inet_ntoa(struct.pack('!I', n))
    print(int2ip(3232235525))
    # -> 192.168.0.5
    

    【讨论】:

    • 反过来:int2ip = lambda iplong: socket.inet_ntoa(struct.pack('!I', iplong))
    【解决方案2】:

    从 python 3.4 开始:

    >>> import ipaddress
    >>> a = ipaddress.IPv4Address('192.168.0.1')
    >>> a+500
    IPv4Address('192.168.1.245')
    >>> a = ipaddress.IPv6Address('2001:1900:2254:206a::50:0')
    >>> a+200
    IPv6Address('2001:1900:2254:206a::50:c8')
    >>>
    

    【讨论】:

      【解决方案3】:

      a module 让这项任务和其他任务变得非常简单:pip install iptools

      In [1]: import iptools
      
      In [3]: iptools.ip2long('127.0.0.1')
      Out[3]: 2130706433
      
      In [4]: p = iptools.ip2long('127.0.0.1') + 1
      In [6]: iptools.long2ip(p)
      Out[6]: '127.0.0.2'
      

      【讨论】:

      • 如果您使用第 3 方模块,请考虑 netaddripaddr
      • 那些很好。也显得成熟了一些。谢谢。
      • @EduardoIvanec 谢谢,我会检查的。我已经尝试过 ipaddr(我猜来自 google 的模块),但我认为我们必须定义一个网络地址,然后它才能迭代该网络中的主机。但我不想定义网络地址。
      • 只是想我应该为路人提一下代码(截至 2014 年 7 月 30 日)看起来像: from iptools.ipv4 (or iptools.ipv6) import ip2long, long2ip
      【解决方案4】:

      将你的IP地址的最后一部分转换成一个数字,加1,然后调用ifconfig

      我认为随着我们跨越网络,增加最后一位的方法不会很好地扩展。 --OP

      我想在我原来的答案中提到这一点,但由于各种原因没有。这些原因如下:

      • 我认为您不太可能需要这样做,但无法猜测您为什么要这样做。
      • 即使您确实需要这样做,您也可以只解析倒数第二个数字。
      • 这仅对网络掩码为 0 的位有效。
      • 您还必须担心“特殊”保留 IP 范围,例如 192.168.etc.etc。带有 0 和可能 ff/255 的十六进制双峰也有特殊含义。 IPv6 中有不同的规则。

      【讨论】:

        【解决方案5】:

        使用简单的添加和迭代可能会更快,例如:

        ip = [192,168,0,0]
        ip_dict = {}
        ip_list = []
        
        for i in range(100):
            new_ip = ip[3]+=1
            ip_dict[i]=new_ip
            ip_list.append(new_ip)
        

        【讨论】:

        • @ninjagecko 我认为随着我们跨越网络,增加最后一位的方法无法很好地扩展。
        • @sabs6488:我认为您的意思是对我的回答发表评论。尽管如此,我还是想在我的回答中提到这一点,但由于各种原因没有。我猜我会更新我的答案。
        【解决方案6】:

        编辑:这是错误的,不应该按原样使用。

        我会为此使用 ipaddr

        >>> import ipaddr
        >>> a = ipaddr.IPAddress('192.168.0.3')
        >>> a
        IPv4Address('192.168.0.3')
        >>> a + 1
        IPv4Address('192.168.0.4')
        

        【讨论】:

        • 越野车,>>> a=ipaddr.IPAddress('192.168.0.3') >>> a+224 IPv4Address('192.168.0.227')
        【解决方案7】:

        ipcalc 有一些例程可以让计算IP 地址变得相当容易。例如,地址范围的迭代器可以这样完成:

        代码:

        import ipcalc
        network = ipcalc.Network('10.1.0.0/16')
        host_first = network.host_first()
        addresses = (host_first + i for i in range(network.size()-2))
        

        测试代码:

        print(next(addresses))
        print(next(addresses))
        print(next(addresses))
        print(max(list(addresses)))
        

        结果:

        10.1.0.1
        10.1.0.2
        10.1.0.3
        10.1.255.254
        

        【讨论】:

          【解决方案8】:
          def FunIncrementIp(IPADDRESS,IPADDRESSES):
          #import the ipaddress module and also check whether it is an ipv6 or ipv4
          import ipaddress
          if ':' in IPADDRESS:
              IPADDRESSMOD = ipaddress.IPv6Address(IPADDRESS)
              print ('this is ipv6 address')
          else:
              IPADDRESSMOD = ipaddress.IPv4Address(IPADDRESS)
              print ('this is ipv4 address')
          IPADDRESSES = int(c)
          IPADDRESSES = IPADDRESSMOD+IPADDRESSES
          while IPADDRESSMOD < IPADDRESSES:
              IPADDRESSMOD += 1
              print(IPADDRESSMOD)
          

          应该这样做。

          FunIncrementIp('1.1.1.1','10')
          

          这会将您的 ipv4 地址增加到 10 个以上

          FunIncrementIp('2001:db8:0:1:1:1:1:1','10')
          

          这会将您的 ipv6 地址增加到 10 个以上 这也将告诉自动检测 ip 地址的类型,这样您就不必为 ipv4 和 ipv6 设置单独的脚本。

          【讨论】:

            猜你喜欢
            • 2011-10-08
            • 2018-12-08
            • 2023-02-22
            • 1970-01-01
            • 1970-01-01
            • 2012-06-06
            • 1970-01-01
            • 2011-03-29
            • 2021-12-30
            相关资源
            最近更新 更多