这是一个用于使用nmap并从python3访问扫描结果的python类
项目描述
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
主页
变更日志
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)
实现了来自 Santhosh Edukulla <santhosh.edukulla@gmail.com> 的请求:解析操作系统扫描输出
多个主机指定错误:来自 old.schepperhand@gmail.com 的错误和补丁
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 的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | f75af6b91dd8e3b0c31f869db32163f62ada686945e5b7c25f84bc0f7fad3b64 |
|
MD5 | 1a97c59260678a2fa186e4d99f3ecb75 |
|
BLAKE2b-256 | f71b8e6b3d1461331e4e8600faf099e7c62ba3c1603987dafdd558681fb8ba37 |