我想将IP地址增加一个固定值。
这正是我想要实现的目标,我有一个IP地址,192.168.0.3
,我希望将其增加1
,这将导致192.168.0.4
甚至是固定值x
,以便它将我的IP地址增加该数字。所以,我可以拥有像192.168.0.3+x
这样的主持人。
我只想知道此转换是否已存在任何模块。
我尝试了socket.inet_aton
然后socket.inet_ntoa
,但我不知道如何让它正常工作。需要一些帮助或建议。
答案 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')
您可以使用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
我想在我的原始答案中提到,但由于各种原因没有。这些原因如下:
答案 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