• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

(Python) и асинхронное использование nmap

28.04.2019
14
0
BIT
0
При использовании python-nmap, но не могу сохранить результат.

Использую словарь, что бы хранить результаты.
Python:
os_list={}
nm = nmap.PortScannerAsync()

Эта функция вызывается и работает. Но она изменяет os_list только внутри себя. В основной программе словарь не изменяется.
Python:
def callback_nmap(host, scan_result):
    global os_list
    try:
        os_list.update({host:scan_result['scan'][host]['osmatch'][0]['osclass'][0]['osfamily']})
    except IndexError:
        pass

Так запускаю сканер
Python:
nm.scan("192.168.1.1", arguments="-O",callback=callback_nmap)

Подозреваю, что всё работает как-то в разных потоках. Как правильно получить результат асинхронного сканирования?
 
28.04.2019
14
0
BIT
0
Ты сканируешь отдельный хост. Видимо из-за этого и нет результата.
Попробуй использовать диапазон 192.168.1.1-100 или 192.168.1.0/24
Результат есть. В callback_nmap ставил принт os_list, всё добавляется. Но только в пределах этой функции. А мне надо как-то забрать результат в основную программу.
Обычно с этим справляется global, а тут как-то не работает.
 

f22

Codeby Academy
Gold Team
05.05.2019
1 943
228
BIT
1 787
А где и как его читать? Может я нублю, но это callback же.
Запиши результат
{host:scan_result['scan'][host]['osmatch'][0]['osclass'][0]['osfamily']}
В другую переменную и потом просто верни её из функции.
А словарь обновляй в том месте, где функция вызывается.
 

zol

Member
26.11.2019
8
0
BIT
0
Подозреваю, что всё работает как-то в разных потоках.
Неправильно подозреваете, асинхронный код исполняется в одном потоке.
Соответственно, никакие примитивы синхронизации не нужны. Записывайте данные в глобальную переменную, атрибут объекта или БД.
Нужна помощь с реализацией?
 
28.04.2019
14
0
BIT
0
Записывайте данные в глобальную переменную, атрибут объекта или БД.
Нужно помочь, ткнуть меня в то, что я делаю не так)))
2020-01-04-04-02-03.png

На ошибку не смотрите, я понимаю откуда она. А вот то, что функция не изменяет значения глобальных переменных видно по нулям.
 

f22

Codeby Academy
Gold Team
05.05.2019
1 943
228
BIT
1 787
А вот то, что функция не изменяет значения глобальных переменных видно по нулям.
Долго помучился, но единственное, что удалось придумать

Python:
import nmap

nm = nmap.PortScannerAsync()
nm.scan("192.168.1.1", arguments="-sP")
result = nm._nm.scan()
print(result)

>>> nm.scan("192.168.1.1", arguments="-sP")
>>> dir(nm)
['__class__', '__del__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_nm', '_process', 'scan', 'still_scanning', 'stop', 'wait']
>>> dir(nm._nm)
['_PortScanner__process', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_nmap_last_output', '_nmap_path', '_nmap_subversion_number', '_nmap_version_number', '_scan_result', 'all_hosts', 'analyse_nmap_xml_scan', 'command_line', 'csv', 'get_nmap_last_output', 'has_host', 'listscan', 'nmap_version', 'scan', 'scaninfo', 'scanstats']
Видимо через это свойство и можно получить результаты сканирования.

Ещё вот нашёл, не знаю, поможет ли.
 

zol

Member
26.11.2019
8
0
BIT
0
Долго помучился
Поддерживаю, глянул на БитБакет исходники, при запуске scan() создается процесс-демон, в котором запускается этот же метод у PortScanner

В общем, у объекта типа PortScannerAsync есть атрибут _nm типа nmap.PortScanner, к методам и атрибутам которого можно обращаться после сканирования (<PSAsyncObject>._nm.still_scanning())
Мне не нравится это решение, но ничего лучше придумать не удалось)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!