为什么输出中只打印端口版本?

问题描述 投票:0回答:1

我试图使用 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

python port python-3.9 nmap
1个回答
0
投票

version
键可能并不总是存在于每个端口,特别是如果该特定端口的版本检测不成功。

为了优雅地处理这种情况,您应该在尝试访问之前检查

version
键是否存在。您可以使用带有默认值的
get()
方法来避免 KeyError 异常。

version = portinfos['scan'][targetip]['tcp'][i].get('version', 'Version information not available')
© www.soinside.com 2019 - 2024. All rights reserved.