【问题标题】:Python randomly generated IP address as stringPython 随机生成的 IP 地址为字符串
【发布时间】:2014-01-27 16:09:20
【问题描述】:

在Python中,如果我想生成一个IP地址形式的随机字符串怎么办?

例如:"10.0.1.1""10.0.3.14""172.23.35.1" 等。

有人可以帮我吗?

【问题讨论】:

    标签: python ip-address


    【解决方案1】:
    >>> import random
    >>> import socket
    >>> import struct
    >>> socket.inet_ntoa(struct.pack('>I', random.randint(1, 0xffffffff)))
    '197.38.59.143'
    >>> socket.inet_ntoa(struct.pack('>I', random.randint(1, 0xffffffff)))
    '228.237.175.64'
    

    注意这可能会生成像0.0.0.0255.255.255.255 这样的 IP。

    【讨论】:

    • 如果我想获得一个IP地址V6,我应该怎么做?谢谢!
    • 如果我想生成特定范围内的IP(例如1.2.4.8和8.4.2.1之间)怎么办?
    • @AhmedHussein for n in range(0x01020408, 0x08040201): ... socket.inet_ntoa(...)
    • @changzhi 查看下面我对 IPv6 的回答
    • 如果二进制 IP 适合您,则无需调用 inet_ntoa,二进制格式的大小远小于字符串格式(IPv4 始终为 4 字节,IPv6 始终为 16 字节),这使得它通过流套接字发送/接收的安全选择
    【解决方案2】:

    如果你只想要一个字符串:

    import random
    
    ip = ".".join(map(str, (random.randint(0, 255) 
                            for _ in range(4))))
    

    【讨论】:

    • 你可以把地图拿出来做".".join(str(randint(0, 255)) for _ in range(4))
    【解决方案3】:
    In [123]: '.'.join('%s'%random.randint(0, 255) for i in range(4))
    Out[123]: '45.204.56.200'
    
    In [124]: '.'.join('%s'%random.randint(0, 255) for i in range(4))
    Out[124]: '7.112.222.205'
    

    【讨论】:

    • 被低估的答案。生成 IP 的好方法,无需外部依赖。
    【解决方案4】:

    这可能太明显了,但如果您需要某个范围内的随机 IP,您可以使用:

    import random
    
    for x in xrange(1,100):
      ip = "192.168."
      ip += ".".join(map(str, (random.randint(0, 255) 
                              for _ in range(2))))
    
      print ip
    

    【讨论】:

      【解决方案5】:

      https://faker.readthedocs.io/en/latest/providers/faker.providers.internet.html

      import faker
      fake = Factory.create()
      ip_addr = fake.ipv4(network=False)
      

      lib 有很多其他有用的选项来伪造数据。

      【讨论】:

        【解决方案6】:
        from faker import Faker  
        faker = Faker()  
        ip_addr = faker.ipv4()  
        

        参考:Fake-Apache-Log-Generator

        【讨论】:

          【解决方案7】:

          另一种以 IP 地址形式生成随机字符串的方法是:

          >>> ip = '{}.{}.{}.{}'.format(*__import__('random').sample(range(0,255),4))
          >>> ip
          '45.162.105.102'
          

          【讨论】:

            【解决方案8】:

            您还可以使用 Python 的 ipaddress module,它更广泛地用于创建、操作和操作 IPv4 和 IPv6 地址和网络:

            import ipaddress
            import random
            
            MAX_IPV4 = ipaddress.IPv4Address._ALL_ONES  # 2 ** 32 - 1
            MAX_IPV6 = ipaddress.IPv6Address._ALL_ONES  # 2 ** 128 - 1
            
            
            def random_ipv4():
                return  ipaddress.IPv4Address._string_from_ip_int(
                    random.randint(0, MAX_IPV4)
                )
            
            def random_ipv6():
                return ipaddress.IPv6Address._string_from_ip_int(
                    random.randint(0, MAX_IPV6)
                )
            

            例子:

            >>> random.seed(444)                                                                                                                                                                                                                                         
            >>> random_ipv4()                                                                                                                                                                                                                                            
            '79.19.184.109'
            >>> random_ipv4()                                                                                                                                                                                                                                            
            '3.99.136.189'
            >>> random_ipv4()                                                                                                                                                                                                                                            
            '124.4.25.53'
            >>> random_ipv6()                                                                                                                                                                                                                                            
            '4fb7:270d:8ba9:c1ed:7124:317:e6be:81f2'
            >>> random_ipv6()                                                                                                                                                                                                                                            
            'fe02:b348:9465:dc65:6998:6627:1300:29c9'
            >>> random_ipv6()                                                                                                                                                                                                                                            
            '74a:dd88:1ff2:bfe3:1f3:81ad:debd:db88'
            

            【讨论】:

            • 我有一个可能很愚蠢的问题,我无法从文档或 Google 中澄清 - 为什么 ipaddress.IPv4Address._ALL_ONES / ipaddress.IPv6Address._ALL_ONES 给我们的 IP 地址总数减 1?是否保留一个地址作为广播地址?谢谢
            • 不要忘记零。这是第一个有效的 IP 地址@mmTmmR
            • 哈哈,谢谢,我觉得我盯着屏幕太久了,弄糊涂了!干杯,您的解决方案正是我所追求的!
            • 在我的代码的其他地方,我使用了 np.random.randint()。为了保持一致,对于上面我尝试将 random.randint(0, MAX_IPV4/6) 换成 np.random.randint(0, (MAX_IPV4/6 +1))。 (由于 np.random.randint() 不包括上限值,因此我在此版本的 MAX_IPV4/MAX_IPV6 的值上加了一个。)对于 IPV4 版本,这可以按照您上面的答案工作,但是当我尝试执行IPV6 版本我收到以下错误:“ValueError:high is out of bounds for int64”。你对这个错误有什么想法吗?我是否需要将我的 IPV6 结果转换为不同的数据类型?谢谢
            • @mmTmmR np.random.randint() 只能达到 2 ** 64 - 1,一个 64 位整数,而 ipaddress.IPv6Address._ALL_ONES 是 128 位。如果您只需要一个随机地址,请使用random; NumPy 是为数组设计的。
            【解决方案9】:

            更快:模仿

            如果你正在寻找速度,试试Mimesis

            from mimesis import Internet 
            random_ip = Internet().ip_v4()
            

            具有有效 CIDR 的 IP:Faker

            如果您希望生成具有有效 CIDR 的随机 IP 地址,请尝试Faker

            from faker import Faker  
            random_valid_ip = Faker().ipv4()  
            

            有关 Faker 为何需要更长时间的更多详细信息,请参阅此issue

            【讨论】:

              【解决方案10】:
              from faker import Factory
              
              fake_generator = Factory.create()
              print(fake_generator.ipv4())
              

              请务必在尝试运行上述程序之前进行 pip install!

              pip install Faker
              

              查看包文档:https://faker.readthedocs.io/en/master/index.html

              这是link directly to the ipv4 method docs

              【讨论】:

                【解决方案11】:

                如果尝试仅基于用户空间(192.168.xxx.xxx、172.16.xxx.xxx-172.31.255.255 和 10.xxx.xxx.xxx)生成私有 IP 地址

                This 的帖子给出了很好的答案

                如果您尝试生成任何其他内容,可以被认为是公开的,请使用这个(我的代码基于上面的帖子):

                import random
                def randomPublicIPaddress():
                    '''
                    oct 1 - cant be 10
                    oct 2 - if oct1 == 192
                                cant be 168
                            if oct1 == 172
                                cant be 16-31
                    oct 3 - can be anything
                    oct 4 - can be anything
                    '''
                    oct1 = random.choice([i for i in range(0,255) if i not in [10,127]])
                    if oct1 == 192:
                        oct2 = random.choice([i for i in range(0,255) if i not in [168]])
                    elif oct1 == 172:
                        oct2 = random.choice([i for i in range(0,255) if i not in range(16,31)])
                    else:
                        oct2 = random.randint(0,255)
                    oct3 = random.randint(0,255)
                    oct4 = random.randint(0,255)
                
                    return ".".join(map(str,([oct1,oct2,oct3,oct4])))
                

                警告,还有许多其他 IP 地址范围被视为“私有”,请务必查看 IANA 上的列表

                【讨论】:

                  猜你喜欢
                  • 2012-03-03
                  • 2017-10-02
                  • 2012-05-03
                  • 1970-01-01
                  • 2019-05-17
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多