Вызовите python-nmap PortScanner(), nmap не найден

В моем virtualenv я установил python-nmap, и nmap установлен (OS X). Но если я вызову mmap как (virtualenv активирован...):

import sys
sys.path.append('/usr/local/bin')

import nmap
nm = nmap.PortScanner()

Я получаю следующую ошибку:

Raise PortScannerError («Программа nmap не найдена в пути»)

nmap.nmap.PortScannerError: «Программа nmap не найдена в пути»

Есть еще способ ввести путь к nmap?


person user2883656    schedule 04.04.2014    source источник


Ответы (4)


sys.path определяет, где интерпретатор Python ищет импортируемые модули. «Путь» в вашей ошибке — это переменная среды ОС PATH, которая сообщает ОС, где искать Nmap. Вы можете установить это напрямую с помощью os.putenv или передать полный путь к двоичному файлу nmap в конструкторе nmap.PortScanner:

nm = nmap.PortScanner('/usr/local/bin/nmap')
person bonsaiviking    schedule 05.04.2014
comment
nm = nmap.PortScanner('/usr/local/bin/nmap') возвращает: __init__() принимает ровно 1 аргумент (даны 2) - person user2883656; 05.04.2014
comment
@user2883656 user2883656 Возможно, я смотрел на более новую версию пакета python-nmap, которая поддерживала этот синтаксис. - person bonsaiviking; 06.04.2014
comment
Какую версию вы используете? Я использую 0.1.4, потому что 0.3.3 поддерживает только Python 3. Но я меняю проект на Python 3 и буду отчитываться. - person user2883656; 06.04.2014
comment
@ user2883656 Если вам нужна поддержка Python 2, вы можете проверить github.com/savon- noir/python-libnmap (не одобрение, я не использовал его) - person bonsaiviking; 06.04.2014

Перенесите проект на Python 3 и обновите nmap до 0.3.3, теперь он работает.

Большое спасибо!

person user2883656    schedule 06.04.2014

установить nmap с доморощенным

brew install nmap

Тогда ваша установка будет работать правильно.

person Daniel Lee    schedule 11.01.2017

Я пробовал эти методы, но они не сработали, поэтому я еще раз изучил их.

Ошибка:

>>> import nmap
>>> nm = nmap.PortScanner()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/dist-packages/nmap/nmap.py", line 137, in __init__
raise PortScannerError('nmap program was not found in path')
nmap.nmap.PortScannerError: 'nmap program was not found in path'

поэтому я заглянул в файл "/usr/local/lib/python2.7/dist-packages/nmap/nmap.py". Код, в котором они проверяют nmap, почему-то не работает.

код:

# regex used to detect nmap
    regex = re.compile('Nmap version [0-9]*\.[0-9]*[^ ]* \( http://nmap\.org \)')
    # launch 'nmap -V', we wait after 'Nmap version 5.0 ( http://nmap.org )'
    p = subprocess.Popen(['nmap', '-V'], bufsize=10000, stdout=subprocess.PIPE)
    self._nmap_last_output = p.communicate()[0] # store stdout
    for line in self._nmap_last_output.split('\n'):
        if regex.match(line) is not None:
            is_nmap_found = True
            # Search for version number
            regex_version = re.compile('[0-9]+')
            regex_subversion = re.compile('\.[0-9]+')

            rv = regex_version.search(line)
            rsv = regex_subversion.search(line)

            if rv is not None and rsv is not None:
                # extract version/subversion
                self._nmap_version_number = int(line[rv.start():rv.end()])
                self._nmap_subversion_number = int(line[rsv.start()+1:rsv.end()])
            break

    if is_nmap_found == False:
        raise PortScannerError('nmap program was not found in path')

Я обнаружил, что первое регулярное выражение не работает, поэтому я изменил это:

из :

regex = re.compile('Nmap version [0-9]*\.[0-9]*[^ ]* \( http://nmap\.org \)')

to:

regex = re.compile('Nmap version [0-9]*\.[0-9]*)

Теперь он работает так, как должен работать!

person asmudeen    schedule 04.02.2018