Найти - Пользователи
Полная версия: Поиск модуля и варианта кода для работы с ip-адресами
Начало » Python для новичков » Поиск модуля и варианта кода для работы с ip-адресами
1 2
kukuruku11
Доброго времени суток!
Пишу код, одной из функций которого является сканирование диапазона адресов, введенных пользователем в виде: 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!’)
PooH
Сошлюсь на себя же http://python.su/forum/topic/25837/?page=1#post-138143
kukuruku11
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
PooH
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)) # поскольку мы преобразовывали с последнего октета, перевернем список
kukuruku11
PooH
Спасибо за поянения
py.user.next
>>> 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
>>>
PooH
py.user.next
import ipaddress
Да, да, не привык просто еще :) New in version 3.3.
kukuruku11
py.user.next
Спасибо! Именно то, что нужно
kukuruku11
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
py.user.next
kukuruku11
TypeError: Can't convert ‘IPv4Address’ object to str implicitly
Нужно обернуть в str().

'a' + str(addr) + 'b'
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB