Как пропустить IP при использовании Nmap в Python?

Я использую nmap в python и пытаюсь сканировать сеть с помощью текстового файла. Все диапазоны сканирования находятся в текстовом файле, например:

192.168.1.1-100 192.168.1.120-200 ...

Хотя, скажем, если сканирование не нашло хост 192.168.1.3, потому что он был офлайн. Программа рухнет. Есть ли способ обойти этот сбой? Могу ли я использовать что-то вроде Try/Catch?


counter = 0
with open('range.txt') as rangefile:
    content = rangefile.readlines()

while counter < len(content):
    nm = nmap.PortScanner()
    #define the nmap scan here
    nm.scan(content[counter], '517', '-sU -sT')

Это образец кода

  File "c:\...\nmapscan.py", line 63, in <module> therehost = Host.objects.get(ipv4_address=hosts) va.assessment.models.DoesNotExist: Host matching query does not exist. Lookup parameters were {'ipv4_address': u'134.250.16.103'}

Это ошибка


person Tigerjz32    schedule 26.07.2012    source источник
comment
Как это происходит? Дает ли это трассировку? Если да, то вы можете попробовать/за исключением этого исключения. Рассматривали ли вы subprocess.Popen вместо модуля nmap? Какой модуль вы используете, если есть? Обратите внимание, что если вы поймаете исключение (при условии, что оно есть), вы можете обнаружить, что остальная часть сканирования не завершена. subprocess.Popen будет почти таким же, как запуск nmap в командной строке.   -  person user1277476    schedule 27.07.2012
comment
Можете ли вы предоставить фрагмент информации о сбое или ошибках? Какие параметры nmap вы используете?   -  person Mark Hillick    schedule 27.07.2012


Ответы (1)


nmap принимает два аргумента для исключения. --exclude принимает имена хостов, а --excludefile берет файл, содержащий имена хостов, которые необходимо исключить. Используйте один из них по мере необходимости. Дополнительные сведения о настройке цели см. на справочной странице.

Вот результат моего теста -

Python 3.2.3 (default, May  3 2012, 15:54:42) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import nmap
>>> nm=nmap.PortScanner()
>>> nm.scan('134.250.16.103','517', '-sU -sT')
{'nmap': {'scanstats': {'uphosts': '0', 'timestr': 'Sat Jul 28 12:54:27 2012', 'downhosts': '1', 'totalhosts': '1', 'elapsed': '3.06'}, 'scaninfo': {'udp': {'services': '517', 'method': 'udp'}, 'tcp': {'services': '517', 'method': 'connect'}}, 'command_line': 'nmap -oX - -p 517 -sU -sT 134.250.16.103'}, 'scan': {'134.250.16.103': {'status': {'state': 'down', 'reason': 'no-response'}, 'hostname': ''}}}
>>> 

Вы можете использовать try-catch-

try:
   nm.scan(content[counter], '517', '-sU -sT')
except:
   #handle exception...

Поскольку вы не знаете, какие серверы не работают, вы можете пропинговать сервер, прежде чем приступить к сканированию nmap.

person Sarowar    schedule 26.07.2012
comment
Большое спасибо за быстрый ответ! Однако при использовании nmap в python вам необходимо импортировать nmap и использовать такие команды, как nm.PortScanner(). Я не думаю, что в библиотеке nmap есть методы для чтения файлов. - person Tigerjz32; 27.07.2012
comment
nmap в python — это просто реализация nmap в python. он выполняет команду nmap, которую вы используете в терминале с помощью subprocess.Popen(). Итак, если python-nmap удовлетворяет ваши потребности, почему вы не реализуете nmap самостоятельно? - person Sarowar; 27.07.2012
comment
с open('range.txt') в виде файла диапазона: content = rangefile.readlines() nm = nmap.PortScanner() counter = 0, тогда как counter ‹ len(content): nm.scan(content[counter], '517', '-sU -sT ') Это то, что я использую, и если IP-адрес не существует, он выдаст ошибку. Могу ли я использовать Try и Exception, чтобы справиться с этим? И если да, то как? - person Tigerjz32; 27.07.2012
comment
какую версию python-nmap используете? Я тестировал на Linux, используя python-nmap 0.2.4. это было довольно успешно. - person Sarowar; 28.07.2012