调用python-nmap PortScanner(),找不到nmap

时间:2014-04-04 18:52:33

标签: python-2.7 virtualenv nmap sys

在我的virtualenv中,我安装了python-nmap并安装了nmap(OS X)。 但如果我把mmap称为(virtualenv激活...):

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

import nmap
nm = nmap.PortScanner()

我收到以下错误:

  

提升PortScannerError(' nmap程序未在路径'中找到)

     

nmap.nmap.PortScannerError:在路径中找不到' nmap程序'

还有另一种方法可以输入nmap的路径吗?

4 个答案:

答案 0 :(得分:1)

将项目移植到Python 3并将nmap更新为0.3.3现在它可以工作。

非常感谢!

答案 1 :(得分:1)

使用自制软件安装nmap

brew install nmap

然后您的安装将正常运行。

答案 2 :(得分:0)

sys.path管理Python解释器查找导入模块的位置。 "路径"在你的错误中是操作系统的PATH环境变量,它告诉操作系统在哪里寻找Nmap。您可以直接使用os.putenv进行设置,也可以将nmap二进制文件的完整路径传递给nmap.PortScanner构造函数:

nm = nmap.PortScanner('/usr/local/bin/nmap')

答案 3 :(得分:0)

我尝试了这些方法但没有奏效,然后我进一步研究了它。

错误:

>>> 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 \)')

为:

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

现在它的工作就像它想要工作一样!