使用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
相关产品推荐
相关产品推荐

