Python-nmap是一个Python库,用于帮助进行网络扫描。它是Nmap网络扫描器的Python接口,允许开发者从Python脚本中直接调用Nmap的功能。这篇文章将详细介绍如何使用python-nmap库来执行各种网络扫描任务。
在开始之前,需要确保安装了Nmap和python-nmap库。可以通过以下命令安装Nmap:
sudo apt-get install nmap
对于python-nmap库,可以使用pip进行安装:
pip install python-nmap
要在Python代码中使用nmap,首先需要导入库:
import nmap
创建一个Nmap扫描实例是使用python-nmap进行扫描的第一步。下面的代码演示了如何创建一个Nmap扫描器对象:
nm = nmap.PortScanner()
nmap -sn
)扫描一个或多个IP地址,以检查它们是否在线:
nm.scan(hosts='192.168.1.0/24', arguments='-sn')
上面的命令使用了-sn
参数,这是Nmap的ping扫描选项,用于执行主机发现而不是端口扫描。-sn
选项除了发送ICMP回显请求(即ping请求),还会发送TCP和/或UDP包到特定的端口。
nmap -sn
,仍然能够探测到设备:用Advanced IP Scanner工具查看192.168.1.118设备是在线的:
nmap -sn 192.168.1.118
用nmap -PR
也可以,但耗时较长:
nmap -PR 192.168.1.118
可以指定扫描单个主机上的特定端口:
nm.scan('127.0.0.1', '22-443')
这将扫描本地主机(127.0.0.1)上从22到443之间的所有端口。
也可以同时扫描多个端口和主机:
nm.scan('192.168.1.0/24 10.0.0.0/24', '22,80,443')
此命令会扫描两个子网内的主机,只检查端口22、80和443。
完成扫描后,可以获取关于发现的每个主机的信息:
for host in nm.all_hosts():
print('Host : %s (%s)' % (host, nm[host].hostname()))
print('State : %s' % nm[host].state())
上述代码将打印出所有已扫描主机的IP地址、主机名和状态(例如,‘up’或’down’)。
除了基础信息外,还可以获取更多细节,如开放端口和相应的服务信息:
for host in nm.all_hosts():
for proto in nm[host].all_protocols():
print('----------')
print('Protocol : %s' % proto)
lport = nm[host][proto].keys()
for port in sorted(lport):
print('port : %s\tstate : %s' % (port, nm[host][proto][port]['state']))
此段代码会列出每个主机的所有开放端口及其状态。
使用python-nmap时,需要考虑到异常情况,比如扫描权限不足、网络问题等。可以通过try-except块来捕获和处理这些异常:
try:
nm.scan(hosts='192.168.1.0/24', arguments='-sS')
except nmap.PortScannerError as e:
print("Scan error: " + str(e))
except Exception as e:
print("Unexpected error: " + str(e))
在上面的代码中,PortScannerError
捕获了与Nmap扫描相关的错误,而其他类型的异常则被通用的Exception
捕获。
Python-nmap可以使用Nmap的操作系统指纹识别功能来猜测目标主机上运行的操作系统类型。以下是如何实现的示例代码:
nm.scan(hosts='192.168.1.100', arguments='-O')
if 'osclass' in nm['192.168.1.100']:
for osclass in nm['192.168.1.100']['osclass']:
print('OSClass.type : {0}'.format(osclass['type']))
print('OSClass.vendor : {0}'.format(osclass['vendor']))
print('OSClass.osfamily : {0}'.format(osclass['osfamily']))
print('OSClass.osgen : {0}'.format(osclass['osgen']))
print('OSClass.accuracy : {0}'.format(osclass['accuracy']))
print('')
这段代码尝试对IP为192.168.1.100的主机进行操作系统检测,并打印出可能的操作系统类别、供应商、家族和生成等信息。
Python-nmap是一个功能强大的工具,可以用来增强网络扫描和主机发现过程。通过以上介绍和代码示例,应该能够开始使用python-nmap库来执行各种网络扫描任务。当然,进行网络扫描时,始终需要遵守相关法律法规,确保扫描活动是合法且有授权的。