我试图使用 Python 自动化 NMAP 端口扫描。当我执行脚本时,除了端口的版本之外,一切都很顺利。
代码如下:
import nmap
nm = nmap.PortScanner()
targetip = 127.0.0.1
firstport = 1
lastport = 1000
for i in range(firstport, lastport + 1):
portinfos = nm.scan(targetip, str(i), arguments='-sV')
state = portinfos['scan'][targetip]['tcp'][i]['state']
service = portinfos['scan'][targetip]['tcp'][i]['name']
version = portinfos['scan'][targetip]['tcp'][i]['version']
if state == 'open':
print(f'\nPort: {i} \nService: {service} \nVersion: {version} \nStatus: {state}\n')
输出:
Port: 80
Service: http
Version:
Status: open
====================================================== =====================
如您所见,除了端口版本(例如 ProFTPd)之外,所有信息都打印在输出中。
当我尝试手动执行 NMAP 命令行时,它起作用了。
我在网上、论坛或图书馆的文档页面上都没有找到有关此问题的信息。
有人知道我做错了什么以及如何解决吗?
有用信息:VSCode 1.87.2; Python 3.9.0; python-nmap 0.7.1
version
键可能并不总是存在于每个端口,特别是如果该特定端口的版本检测不成功。
为了优雅地处理这种情况,您应该在尝试访问之前检查
version
键是否存在。您可以使用带有默认值的 get()
方法来避免 KeyError 异常。
version = portinfos['scan'][targetip]['tcp'][i].get('version', 'Version information not available')