python增量ipaddress

时间:2012-03-02 19:12:43

标签: python networking

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

这正是我想要实现的目标,我有一个IP地址,192.168.0.3,我希望将其增加1,这将导致192.168.0.4甚至是固定值x,以便它将我的IP地址增加该数字。所以,我可以拥有像192.168.0.3+x这样的主持人。

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

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

8 个答案:

答案 0 :(得分:11)

在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

答案 1 :(得分:5)

从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')
>>>

答案 2 :(得分:4)

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 :(得分:2)

将您IP地址的最后一部分转换为数字,向其中添加1,然后拨打ifconfig

  

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

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

  • 我认为你不太可能需要这样做,也无法猜到你想要的原因。
  • 即使您确实需要这样做,也可以解析倒数第二个数字。
  • 这仅适用于网络掩码为0的位。
  • 您还必须担心“特殊”保留的IP范围,例如192.168.etc.etc。另外,带有0和可能ff / 255的十六进制双精度具有特殊含义。 IPv6中有不同的规则。

答案 4 :(得分:1)

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

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)

答案 5 :(得分:1)

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

我会将ipaddr用于此

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

答案 6 :(得分:0)

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&amp;的IPv6。

答案 7 :(得分:0)

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