跳转到主要内容

这是一个用于使用nmap并从python3访问扫描结果的python类

项目描述

PyPI latest PyPI Version PyPI License

python-nmap 是一个python库,用于帮助使用nmap端口扫描器。它允许轻松操作nmap扫描结果,是系统管理员自动化扫描任务和报告的完美工具。它还支持nmap脚本输出。

它甚至可以异步使用。结果将逐个主机返回到用户定义的回调函数。

下载最新版本

python-nmap-0.4.1.tar.gz - 2015-08-21 md5sum is b466e4b2ef30a0b9c0cb80aac215fb79

警告:此版本旨在与Python 3.x一起使用。对于Python 2.x,请使用python-nmap-0.1.4.tar.gz

下载开发版本

$ hg clone https://bitbucket.org/xael/python-nmap

安装

从shell中,解压缩python-nmap-0.4.1.tar.gz,然后运行make

$ tar xvzf python-nmap-0.4.1.tar.gz
$ cd python-nmap-0.4.1
$ python setup.py install

或使用Pip

$ pip install python-nmap

现在您可以从python中调用nmap

$ python
Python 2.6.4 (r264:75706, Dec  7 2009, 18:45:15)
[GCC 4.4.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>> import nmap

用法

从python/ipython

>>> import nmap
>>> nm = nmap.PortScanner()
>>> nm.scan('127.0.0.1', '22-443')
>>> nm.command_line()
'nmap -oX - -p 22-443 -sV 127.0.0.1'
>>> nm.scaninfo()
{'tcp': {'services': '22-443', 'method': 'connect'}}
>>> nm.all_hosts()
['127.0.0.1']
>>> nm['127.0.0.1'].hostname()
'localhost'
>>> nm['127.0.0.1'].state()
'up'
>>> nm['127.0.0.1'].all_protocols()
['tcp']
>>> nm['127.0.0.1']['tcp'].keys()
[80, 25, 443, 22, 111]
>>> nm['127.0.0.1'].has_tcp(22)
True
>>> nm['127.0.0.1'].has_tcp(23)
False
>>> nm['127.0.0.1']['tcp'][22]
{'state': 'open', 'reason': 'syn-ack', 'name': 'ssh'}
>>> nm['127.0.0.1'].tcp(22)
{'state': 'open', 'reason': 'syn-ack', 'name': 'ssh'}
>>> nm['127.0.0.1']['tcp'][22]['state']
'open'

>>> for host in nm.all_hosts():
>>>     print('----------------------------------------------------')
>>>     print('Host : %s (%s)' % (host, nm[host].hostname()))
>>>     print('State : %s' % nm[host].state())
>>>     for proto in nm[host].all_protocols():
>>>         print('----------')
>>>         print('Protocol : %s' % proto)
>>>
>>>         lport = nm[host][proto].keys()
>>>         lport.sort()
>>>         for port in lport:
>>>             print ('port : %s\tstate : %s' % (port, nm[host][proto][port]['state']))
----------------------------------------------------
Host : 127.0.0.1 (localhost)
State : up
----------
Protocol : tcp
port : 22   state : open
port : 25   state : open
port : 80   state : open
port : 111  state : open
port : 443  state : open

导出到文件

>>> print(nm.csv())
host;protocol;port;name;state;product;extrainfo;reason;version;conf
127.0.0.1;tcp;22;ssh;open;OpenSSH;protocol 2.0;syn-ack;5.9p1 Debian 5ubuntu1;10
127.0.0.1;tcp;25;smtp;open;Exim smtpd;;syn-ack;4.76;10
127.0.0.1;tcp;53;domain;open;dnsmasq;;syn-ack;2.59;10
127.0.0.1;tcp;80;http;open;Apache httpd;(Ubuntu);syn-ack;2.2.22;10
127.0.0.1;tcp;111;rpcbind;open;;;syn-ack;;10
127.0.0.1;tcp;139;netbios-ssn;open;Samba smbd;workgroup: WORKGROUP;syn-ack;3.X;10
127.0.0.1;tcp;443;;open;;;syn-ack;;

检查网络状态

>>> nm.scan(hosts='192.168.1.0/24', arguments='-n -sP -PE -PA21,23,80,3389')
>>> hosts_list = [(x, nm[x]['status']['state']) for x in nm.all_hosts()]
>>> for host, status in hosts_list:
>>>     print('{0}:{1}'.host)
192.168.1.0:down
192.168.1.1:up
192.168.1.10:down
192.168.1.100:down
192.168.1.101:down
192.168.1.102:down
192.168.1.103:down
192.168.1.104:down
192.168.1.105:down
[...]

使用异步扫描器

>>> nma = nmap.PortScannerAsync()
>>> def callback_result(host, scan_result):
>>>     print '------------------'
>>>     print host, scan_result
>>>
>>> nma.scan(hosts='192.168.1.0/30', arguments='-sP', callback=callback_result)
>>> while nma.still_scanning():
>>>     print("Waiting >>>")
>>>     nma.wait(2)   # you can do whatever you want but I choose to wait after the end of the scan
>>>
192.168.1.1 {'nmap': {'scanstats': {'uphosts': '1', 'timestr': 'Mon Jun  7 11:31:11 2010', 'downhosts': '0', 'totalhosts': '1', 'elapsed': '0.43'}, 'scaninfo': {}, 'command_line': 'nmap -oX - -sP 192.168.1.1'}, 'scan': {'192.168.1.1': {'status': {'state': 'up', 'reason': 'arp-response'}, 'hostname': 'neufbox'}}}
------------------
192.168.1.2 {'nmap': {'scanstats': {'uphosts': '0', 'timestr': 'Mon Jun  7 11:31:11 2010', 'downhosts': '1', 'totalhosts': '1', 'elapsed': '0.29'}, 'scaninfo': {}, 'command_line': 'nmap -oX - -sP 192.168.1.2'}, 'scan': {'192.168.1.2': {'status': {'state': 'down', 'reason': 'no-response'}, 'hostname': ''}}}
------------------
192.168.1.3 {'nmap': {'scanstats': {'uphosts': '0', 'timestr': 'Mon Jun  7 11:31:11 2010', 'downhosts': '1', 'totalhosts': '1', 'elapsed': '0.29'}, 'scaninfo': {}, 'command_line': 'nmap -oX - -sP 192.168.1.3'}, 'scan': {'192.168.1.3': {'status': {'state': 'down', 'reason': 'no-response'}, 'hostname': ''}}}
>>> nm = nmap.PortScannerYield() >>> for progressive_result in nm.scan('127.0.0.1/24', '22-25'): >>> print(progressive_result)

请参阅存档文件中的 example.py 示例。

使用异步扫描器

>>> nm = nmap.PortScanner()
>>> nm.scan('127.0.0.1', '22-40043', timeout=10)
PortScannerTimeout: 'Timeout from nmap process'

贡献者

Steve 'Ashcrow' Milner
Brian Bustin
old.schepperhand
Johan Lundberg
Thomas D. maaaaz
Robert Bost
David Peltier
Ed Jones

主页

http://xael.org/norman/python/python-nmap/

变更日志

2021/10/26 (v0.7.1)

  • 修复 setup.cfg

  • 修复构建工具

2020/03/02 (v0.7.0)

  • 添加 black 和 flake8 用于开发

  • 停止支持python2.7

2020/02/28 (v0.6.4)

  • 添加超时参数和 PortScannerTimeout 异常

2018/09/23 (v0.6.3)

  • 重构 Readme 和变更日志文件以符合 Pypi 模式,并应用样式以更好地可视化区块

  • 将 setup.py 修改为使用显式的 Python 版本,因为 Python 2.x 不支持异步任务。

  • 在 Makefile 中添加 clean 方法。

  • 更新 Manifest 文件。

  • 更新版本和修复 nmap/nmap.py 中的 PEP8。

2017/01/07 (v0.6.2)

2016/07/29 (v0.6.1)

  • 修复 bug #22:scan_progressive 中的 UnboundLocalError。

  • 修复 bug #23:在 nmap 警告时扫描失败。

  • 修复 bug #20:修复 值为空导致 CSV 输出为空白的错误。

  • 修复 bug #18:print(nm.csv()) 不返回任何结果。

  • 修复 bug #19:nmap 程序在路径中未找到。

  • 修复 bug #17:不再报告主机名。

2016/03/15 (v0.6.0)

  • 添加有关 Nmap 特别许可的信息。

  • 分发 python-nmap 与 nmap 一起时的许可精度。

2016/03/15 (v0.5.2)

  • 将主机名添加到 CSV 导出。

2015/12/05 (v0.5.0-1)

  • 更新 example.py。

2015/11/18 (v0.5.0)

  • 关闭 bug:- #11 显示一个 osclass/osmatch 而不是多个。

  • 数据结构更改:- osmatch 是 osclass 的列表 - osclass 是字典的列表 - 添加了 cpe,它是字符串的列表 - 添加了 portused,它是字典的列表。

    主机的数据结构如下:

{'addresses': {'ipv4': '127.0.0.1'},
  'hostnames': [],
  'osmatch': [{'accuracy': '98',
              'line': '36241',
              'name': 'Juniper SA4000 SSL VPN gateway (IVE OS 7.0)',
              'osclass': [{'accuracy': '98',
                            'cpe': ['cpe:/h:juniper:sa4000',
                                    'cpe:/o:juniper:ive_os:7'],
                            'osfamily': 'IVE OS',
                            'osgen': '7.X',
                            'type': 'firewall',
                            'vendor': 'Juniper'}]},
              {'accuracy': '91',
              'line': '17374',
              'name': 'Citrix Access Gateway VPN gateway',
              'osclass': [{'accuracy': '91',
                            'cpe': [],
                            'osfamily': 'embedded',
                            'osgen': None,
                            'type': 'proxy server',
                            'vendor': 'Citrix'}]}],
  'portused': [{'portid': '443', 'proto': 'tcp', 'state': 'open'},
              {'portid': '113', 'proto': 'tcp', 'state': 'closed'}],
  'status': {'reason': 'syn-ack', 'state': 'up'},
  'tcp': {113: {'conf': '3',
                'cpe': '',
                'extrainfo': '',
                'name': 'ident',
                'product': '',
                'reason': 'conn-refused',
                'state': 'closed',
                'version': ''},
          443: {'conf': '10',
                'cpe': '',
                'extrainfo': '',
                'name': 'http',
                'product': 'Juniper SA2000 or SA4000 VPN gateway http config',
                'reason': 'syn-ack',
                'state': 'open',
                'version': ''}},
  'vendor': {}}

2015/11/17 (v0.4.7)

  • 关闭 bug:- #10 尝试解析 'osclass' 时出错,'osmatch' 移除了 addresses、hostnames、status、vendor、osclass、uptime、osmatch 从 all_protocols() 中。

  • 将 shebang 行从 python3 改为 python,因为它与 python2 兼容。

2015/11/13 (v0.4.6)

  • 关闭 bug:- #10 尝试解析 'osclass' 时出错,'osmatch'。

2015/10/25 (v0.4.5)

  • 关闭 bug:- #9 在扫描函数中无法传递 Unicode 字符串的端口。

2015/10/17 (v0.4.4)

  • 关闭 bug:- #8 IPv6 异步扫描器不工作。

2015/09/11 (v0.4.3)

  • 更改 __get_last_online_version 的 URL。

2015/09/11 (v0.4.2)

  • 关闭 bug:- #7:空主机名时出错 - #6:当重定向 stdin/stdout/stderr 时,Windows 对 close_fds 的支持。

2015/08/21 (v0.4.1)

  • 关闭 bug:- #5:每个主机只存储一个主机名。

  • 添加 hostnames() 方法,它返回主机名列表,作为字典的列表 [{‘name’:’hostname1’, ‘type’:’PTR’}, {‘name’:’hostname2’, ‘type’:’user’}]。

2015/08/01 (v0.4.0)

  • 关闭 bug:- #2:在 subprocess.Popen 中使用 close_fds - #3:使用 xml.dom.minidom 解析 xml 时的内存泄漏。

  • 修正解析 osclass 中的 bug。

  • 添加 nosetests 用于案例测试。

  • 从 docstring 中删除测试用例。

2015/05/08 (v0.3.7)

  • 添加 sudo 参数进行扫描(来自 scupython 的想法)。

2015/05/08 (v0.3.6)

  • 修正问题 7:Windows 下的问题。

2015/05/08 (v0.3.5)

  • 修正 all_protocols() 中的 bug。

  • 修正问题 8:PortScannerAsync 在 Windows 中不工作。

2014/06/22 (v0.3.4)

  • 添加 PortScannerYield 类,具有生成器 >>> nm = nmap.PortScannerYield() >>> for i in nm.scan(‘127.0.0.1/24’, ‘22-25’): >>> print(i)

2014/03/13 (v0.3.3)

  • 移动文件 example.py。

  • 添加 convert_nmap_output_to_encoding 函数。

  • 添加 MAC 地址的厂商。

2013/09/23 (v0.3.2)

  • 添加在 [host][proto][port][‘cpe’] 键下访问 CPE 值的权限。

2013/07/27 (v0.3.1)

  • Robert Bost 提出的 PortScannerAsync.scan 中的回调 assert 的 bug 修正。

2013/06/23 (v0.3.0)

  • 添加对 NMAP SCRIPT ENGINE 的支持。

>>> r=nm.scan(hosts='127.0.0.1', ports='139', arguments="-sC ")
>>> print(nm._scan_result['scan']['127.0.0.1']['hostscript'])

2013/02/24 (v0.2.7)

  • 在主机扫描结果中添加地址块,包含 ipv4、mac 和其他地址。

nm = nmap.PortScanner()
r = nm.scan(arguments='-sS -p T:22', hosts='192.168.1.3')
print r['scan']['192.168.1.3']['addresses']
{u'mac': u'02:50:43:F4:02:B1', u'ipv4': u'192.168.1.3'}

- Adding a CSV scan output as a string.
- Changes examples.py to make it python3 compliant

2012/12/13 (v0.2.6)

  • lundberg.johan 的补丁。

  • bug 修正:当 nmap 不工作时显示 stderr 而不是 stdout。

2012/11/23 (v0.2.5)

  • 修正:问题 2:“map.nmap.PortScannerError:'nmap 程序在路径中未找到'”在 CentOS 上。

  • 修正:问题3:nmap.scan() 早期短路

2011/11/09 (v0.2.4)

2011/11/04

  • example.py 中的错误:如果没有在 22-443 之间打开 TCP 端口

2010/12/17 (v0.2.3)

  • 添加 __get_last_online_version 以检查当前版本是否为最后一个发布的版本

2010/12/17 (v0.2.2)

  • 处理 nmap_error 输出时的错误(返回值是二进制,期望是字符串)

  • 从 __init__.py 文件中删除测试字符串。

2010/12/15 (v0.2.1)

  • 修正 __init__.py 中的关于作用域的问题

  • 尝试在已知目录中查找 nmap 可执行文件

  • 在尝试调用 command_line、scaninfo、scanstats、has_host 在扫描之前抛出 AssertionError

2010/12/14 (v0.2.0)

  • 使 python-nmap 与 Python 3.x 兼容

  • 来自 Brian Bustin <brian at bustin.us> 的贡献

2010/06/07 (v0.1.4)

  • 来自 Steve ‘Ashcrow’ Milner <steve at gnulinux.net> 的补丁

  • 从 __init__.py 中删除 shebang,因为它不是一个可运行的脚本

  • 允许使用 ALPHA 和 BETA 版本的 nmap

  • 废弃 .has_key(),用 in 替换实例

  • 移动到使用 print 函数,以支持 python2 和 3 的使用

2010/06/04

  • 添加 PortScanner.listscan

  • PortScanner.scan 现在返回 scan_result

  • 添加类 PortScannerAsync(灵感来自 Steve ‘Ashcrow’ Milner <steve at gnulinux.net>)

2010/06/03

  • 在 google code svn checkout https://python-nmap.googlecode.com/svn/trunk/ python-nmap –username XXXXX 中导入

  • 添加 PortScanner.scanstats 方法

  • 更新 example.py 和 pingsweep 的文档

  • 更新 Makefile 以生成文档

2010/03/09

  • 修改打包。v0.1.1 [norman]

2010/03/08

  • 初始发布。v0.1.0 [norman]

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源分布

python-nmap-0.7.1.tar.gz (44.4 kB 查看哈希)

上传时间

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面