python-nmap主机从不向上

时间:2018-03-28 20:38:43

标签: python networking nmap

我一直在尝试让python-nmap将ip地址列表作为输入并输出已启动的主机列表。但是,这会产生一个空列表。

def scan(registered_hosts, port):
    hosts_up = []
    nmScan = nm.scan(' '.join(registered_hosts))
    for host in nm.all_hosts():
        if nm[host]['tcp'][port]['state'] == 'open':
            hosts_up.append({
                'host': host,
                'url': 'http://%s:%s' % (host, str(port)),
                'hostname': nm[host].hostname()
            })
    return hosts_up

函数的输入是ip的列表(即['192.168.0.1', '192.168.0.2'],在我用空格加入之后,我将它作为参数传递给nm.scan()函数。我至少知道其中一个列出的地址已启动,但该命令返回一个空列表。有什么想法在这里发生了什么?

1 个答案:

答案 0 :(得分:1)

您的代码存在一些问题:

  • 您不会创建nmap对象;
  • scan()似乎不支持使用此格式的多个ips,虽然我可能错了(scan source code);

因此,固定代码应为:

def scan(registered_hosts, port):
    hosts_up = []
    nm = nmap.PortScanner()
    for host in registered_hosts:
        scan_result = nm.scan(hosts=host, ports=port)
        if scan_result['scan'].get(host, {}).get('tcp', {}).get(int(port), {}).get('state', '') == 'open':
            hosts_up.append({
                'host': host,
                'url': 'http://%s:%s' % (host, str(port)),
                'hostname': nm[host].hostname()
            })
    return hosts_up

可悲的是,如果对一个序列不感兴趣,这个lib似乎与多个ips完全同步。因此,如果您正在寻找异步解决方案,您应该自己构建一个:(

请带上一点点代码:它没有经过测试。