Форум сайта python.su
0
Доброго времени суток!
Пишу код, одной из функций которого является сканирование диапазона адресов, введенных пользователем в виде: 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!’)
Офлайн
72
Сошлюсь на себя же http://python.su/forum/topic/25837/?page=1#post-138143
Офлайн
0
PooH
Сошлюсь на себя же http://python.su/forum/topic/25837/?page=1#post-138143
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
Офлайн
72
kukuruku11Преобразует строку в ip-адрес. Преобразует каждый октет в число и ставит его на нужное место в бинарном представлении(первый октет смещается на 24 бита влево, второй на 16, третий на 8, четвертый не смещается)
Спасибо за ответ! Eсть несколько вопросов. Что выполняют первые две функции?
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)
Офлайн
0
PooHСпасибо за поянения
Офлайн
857
>>> 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 >>>
Офлайн
72
py.user.nextДа, да, не привык просто еще :) New in version 3.3.
import ipaddress
Офлайн
0
py.user.nextСпасибо! Именно то, что нужно
Офлайн
0
py.user.nextА в каком формате функция IPv4Address возвращает значения?
[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]
Отредактировано kukuruku11 (Июнь 20, 2015 00:06:13)
Офлайн
857
kukuruku11Нужно обернуть в str().TypeError: Can't convert ‘IPv4Address’ object to str implicitly
'a' + str(addr) + 'b'
Офлайн