You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用python-nmap扫描IP列表获取存活主机却返回空列表的问题排查

排查Python-nmap返回空存活主机列表的问题

嘿,我来帮你梳理下代码里可能导致空列表的几个关键点,一步步来排查:

1. 扫描时遗漏了目标端口参数

你的函数明明接收了port参数,但调用nm.scan()的时候只传了IP列表,完全没指定要扫描的端口!默认情况下nmap不会主动扫描你关心的那个端口,自然找不到open状态的记录,返回空列表也不奇怪。

把扫描调用改成这样,加上端口指定:

nmScan = nm.scan(' '.join(registered_hosts), ports=str(port))

2. 没有先判断主机是否存活

直接遍历nm.all_hosts()的话,里面可能混着nmap判定为down的主机,这时候强行访问nm[host]['tcp'][port]要么报错,要么直接跳过。先加个主机存活判断:

for host in nm.all_hosts():
    # 先筛掉已判定为下线的主机
    if nm[host].state() != 'up':
        continue
    # 再安全检查端口是否存在且状态为open
    if 'tcp' in nm[host] and port in nm[host]['tcp'] and nm[host]['tcp'][port]['state'] == 'open':
        hosts_up.append({
            'host': host,
            'url': f'http://{host}:{port}',
            'hostname': nm[host].hostname()
        })

3. IP列表拼接的小坑

用' '.join()拼接IP列表虽然可行,但如果列表里有格式异常的IP(比如带空格、无效字符),会生成nmap无法识别的目标字符串。换成逗号分隔更稳妥(nmap原生支持这种格式):

nmScan = nm.scan(','.join(registered_hosts), ports=str(port))

4. 容易忽略的权限问题

nmap扫描很多端口需要root/管理员权限,如果你的Python脚本是以普通用户身份运行的,可能无法准确获取端口状态,甚至直接返回空结果。试试用sudo运行你的脚本,看看有没有变化。

5. 调试小技巧

如果还是找不到问题,加几行调试输出看看nmap的原始扫描数据,能帮你快速定位:

print("扫描原始结果:", nmScan)
print("nmap发现的所有主机:", nm.all_hosts())

按这些方向调整后,应该就能解决返回空列表的问题啦。

内容的提问来源于stack exchange,提问作者Corrado

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:40:52