приращение питона ipaddress - PullRequest
9 голосов
/ 02 марта 2012

Я хотел бы увеличить 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 ]

11 голосов
/ 02 марта 2012

В 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
5 голосов
/ 11 апреля 2014

Начиная с версии 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')
>>>
4 голосов
/ 02 марта 2012

Есть модуль , который делает эту и другие задачи очень простыми: 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'
2 голосов
/ 02 марта 2012

Преобразуйте последнюю часть вашего IP-адреса в число, добавьте к нему 1 и позвоните ifconfig.

Я думаю, что подход приращения последнего бита не будет хорошо масштабироваться, так как мы работаем в разных сетях. -OP

Я думал упомянуть об этом в своем первоначальном ответе, но не сделал этого по разным причинам. Эти причины следующие:

  • Я подумал, что вряд ли вам понадобится это сделать, и не мог догадаться, почему вы хотите.
  • Даже если вам действительно нужно это сделать, вы можете просто проанализировать второй до последнего номер.
  • Это действительно только для тех битов, где маска сети равна 0.
  • Вам также нужно беспокоиться о «специальных» зарезервированных диапазонах IP-адресов, таких как 192.168.etc.etc. Также шестнадцатеричные дублеты с 0 и, возможно, ff / 255 имеют особое значение. В IPv6 существуют разные правила.
1 голос
/ 03 марта 2012

РЕДАКТИРОВАТЬ: Это глючит и не должен использоваться как есть.

Я бы использовал ipaddr для этого

>>> import ipaddr
>>> a = ipaddr.IPAddress('192.168.0.3')
>>> a
IPv4Address('192.168.0.3')
>>> a + 1
IPv4Address('192.168.0.4')
1 голос
/ 02 марта 2012

Возможно, будет проще использовать простое сложение и итерацию, например:

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)
0 голосов
/ 25 февраля 2017

В библиотеке 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
0 голосов
/ 31 марта 2016
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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...