Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 18, 2015 12:58:36

kukuruku11
Зарегистрирован: 2015-06-18
Сообщения: 44
Репутация: +  0  -
Профиль   Отправить e-mail  

Поиск модуля и варианта кода для работы с ip-адресами

Доброго времени суток!
Пишу код, одной из функций которого является сканирование диапазона адресов, введенных пользователем в виде: XXX.XXX.XXX.XXX_start-XXX.XXX.XXX.XXX_end
Не хочу создавать велосипед, поэтому спросил у сообщества. Есть ли модуль для сканирования заданного дипазона?

Если модуля не будет, то свой код планирую организовать следующим образом:
# считывание диапазона пользователя
# выделение октетов из адресов
# собственно организация цикла по сканированию
for num in range(XXX_start,XXX_end):
hostname = “XXX.XXX.XXX” + str(num)
response = os.system(“ping -c 1 -w2 ” + hostname + “ > /dev/null 2>&1”)
if response == 0:
print (hostname, ‘ is up!’)
else:
print (hostname, ‘ is down!’)

Офлайн

#2 Июнь 18, 2015 13:06:39

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Поиск модуля и варианта кода для работы с ip-адресами

Сошлюсь на себя же http://python.su/forum/topic/25837/?page=1#post-138143



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#3 Июнь 18, 2015 14:03:43

kukuruku11
Зарегистрирован: 2015-06-18
Сообщения: 44
Репутация: +  0  -
Профиль   Отправить e-mail  

Поиск модуля и варианта кода для работы с ip-адресами

PooH
Сошлюсь на себя же http://python.su/forum/topic/25837/?page=1#post-138143

Спасибо за ответ! Eсть несколько вопросов. Что выполняют первые две функции? Первая , как понимаю, сплитом режет адрес и дописывает в переменную.
def ip2bin(s):
    b = 0
    for x in s.split('.'):
        b |= int(x) #что выполняет этот оператор?
        b <<= 8 # и этот?
    return b >> 8 
# вторая как понимаю формирует список из октетов
def bin2ip(b): 
    ls = []
    for _ in range(4):        
        ls.append(str(int(b & 0b11111111))) # поясни, пожалуйста, код в скобках
        b >>= 8        
    return '.'.join(reversed(ls))
    
def iter_net(ip1, ip2):
    x = ip2bin(ip1)
    b2 = ip2bin(ip2)
    while x <= b2:
        yield bin2ip(x) # возврат объекта-генератора?
        x += 1
for x in iter_net('192.168.0.1', '192.168.0.127'):
    print x

Офлайн

#4 Июнь 18, 2015 14:23:05

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Поиск модуля и варианта кода для работы с ip-адресами

kukuruku11
Спасибо за ответ! Eсть несколько вопросов. Что выполняют первые две функции?
Преобразует строку в ip-адрес. Преобразует каждый октет в число и ставит его на нужное место в бинарном представлении(первый октет смещается на 24 бита влево, второй на 16, третий на 8, четвертый не смещается)
def ip2bin(s):
    b = 0
    for x in s.split('.'):   # 
        b |= int(x) # побитовое OR b и int(x), результат в b - бит что установлен в любом из операндов будет и в результате
        b <<= 8 # смещение на восемь бит влево
    return b >> 8  # сместили лишнего, вернем на восемь бит назад

это обратное преобразование из числа в строку
def bin2ip(b): 
    ls = []
    for _ in range(4):        
        ls.append(str(int(b & 0b11111111))) # побитовое AND в результате будут только те биты, что установлены в обоих операндах
                                                             # таким образом из 32-битного числа мы берем последние восемь бит
        b >>= 8   # а тут мы сдвигаем в конец следующие восемь бит      
    return '.'.join(reversed(ls)) # поскольку мы преобразовывали с последнего октета, перевернем список



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Отредактировано PooH (Июнь 18, 2015 14:27:02)

Офлайн

#5 Июнь 18, 2015 15:43:17

kukuruku11
Зарегистрирован: 2015-06-18
Сообщения: 44
Репутация: +  0  -
Профиль   Отправить e-mail  

Поиск модуля и варианта кода для работы с ip-адресами

PooH
Спасибо за поянения

Офлайн

#6 Июнь 18, 2015 23:24:18

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Поиск модуля и варианта кода для работы с ip-адресами

>>> import ipaddress
>>> 
>>> start = ipaddress.IPv4Address('127.0.0.250')
>>> end = ipaddress.IPv4Address('127.0.1.5')
>>> 
>>> while start <= end:
...     print(start)
...     start += 1
... 
127.0.0.250
127.0.0.251
127.0.0.252
127.0.0.253
127.0.0.254
127.0.0.255
127.0.1.0
127.0.1.1
127.0.1.2
127.0.1.3
127.0.1.4
127.0.1.5
>>>



Офлайн

#7 Июнь 19, 2015 06:46:04

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Поиск модуля и варианта кода для работы с ip-адресами

py.user.next
import ipaddress
Да, да, не привык просто еще :) New in version 3.3.



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#8 Июнь 19, 2015 08:05:55

kukuruku11
Зарегистрирован: 2015-06-18
Сообщения: 44
Репутация: +  0  -
Профиль   Отправить e-mail  

Поиск модуля и варианта кода для работы с ip-адресами

py.user.next
Спасибо! Именно то, что нужно

Офлайн

#9 Июнь 20, 2015 00:04:59

kukuruku11
Зарегистрирован: 2015-06-18
Сообщения: 44
Репутация: +  0  -
Профиль   Отправить e-mail  

Поиск модуля и варианта кода для работы с ip-адресами

py.user.next
А в каком формате функция IPv4Address возвращает значения?

Вот этот код выдает ошибку TypeError: Can't convert ‘IPv4Address’ object to str implicitly

[code]import os, ipaddress
position_start=input('Start hostname: ')
position_end=input('End hostname: ')
hostname_start = ipaddress.IPv4Address(position_start)
hostname_end = ipaddress.IPv4Address(position_end)
while hostname_start <= hostname_end:
print(hostname_start)
hostname_response = os.system("ping -c 1 -w2 " +hostname_start + " > /dev/null 2>&1")
if hostname_response == 0:
print (hostname_response, ' is up!\n')
else:
print (hostname_response, ' is down!\n')
hostname_start += 1
input("\nPress the enter key to exit...")[/code]

Изменяю
hostname_response = os.system(“ping -c 1 -w2 ” +hostname_start + “ > /dev/null 2>&1”)
на hostname_response = os.system(“ping -c 1 -w2 ” +str(hostname_start) + “ > /dev/null 2>&1”)

При попытке пинга выдает везде значение “”256

Отредактировано kukuruku11 (Июнь 20, 2015 00:06:13)

Офлайн

#10 Июнь 20, 2015 00:09:58

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Поиск модуля и варианта кода для работы с ip-адресами

kukuruku11
TypeError: Can't convert ‘IPv4Address’ object to str implicitly
Нужно обернуть в str().

'a' + str(addr) + 'b'



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version