使用 python nmap 模块扫描从先前扫描生成的主机
Posted
技术标签:
【中文标题】使用 python nmap 模块扫描从先前扫描生成的主机【英文标题】:Using python nmap module to scan hosts generated from a previous scan 【发布时间】:2014-09-07 06:07:04 【问题描述】:我一直在直接从 python 命令行使用该模块,试图弄清楚它是如何工作的,并开始拼凑我想要编写的脚本将如何工作。我想做的是先做一个简单的主机发现扫描,例如 -n -sP -PE,然后使用 all_hosts() 函数生成主机列表以进行实际端口扫描。所以如果我这样做......
import nmap
nm = nmap.PortScanner()
nm.scan(hosts='XXX.XXX.XXX.X/24', arguments='-n -sP -PE')
然后 nm.all_hosts() 给出了我正在寻找的内容,即扫描找到的所有活动主机的简短列表。现在,我遇到的问题是将其传递给下一次扫描。如果你只是做类似的事情
hostlist = nm.all_hosts()
nm.scan(hosts=hostlist etc)
然后它抱怨无法将列表用于 hosts 参数。好的,有道理。所以我试着用逗号分隔,所以它们会显示为 aaa.aaa.aaa.aaa、bbb.bbb.bbb.bbb 等,通过这样做......
hostlist = ""
for item in nm.all_hosts():
hostlist = item + ", " + hostlist
然后,只是转储主机列表,它看起来就像我想要的那样,但是如果您尝试将其插入主机参数中,它会显示“无法解析”alltheipslisted“警告:没有指定目标,所以 0已扫描主机。
有没有人对如何解决这个问题有什么好主意?也许转储IP然后从文件中提取它们?如果字符串不起作用,似乎我会遇到同样的问题......
【问题讨论】:
我内心的书呆子希望指出,这是一种糟糕的构建字符串的方式,并且会随着 nm.all_hosts() 的增加而导致资源(CPU)耗尽的迅速增加。幸运的是,下面接受的答案使用了 string.join,它不会出现这种算法错误。 好吧,我对python很陌生,所以让你内心的书呆子流淌,我总是愿意学习新的技巧来提高效率。我用过 .split,但 .join 对我来说是新的,谢谢 =) 很高兴为您提供帮助。不过,这是一个普遍的问题,不是特定于 Python 的。在 Java、Lua、Ruby 以及可能大多数其他语言中,使用连接构建长字符串是不好的。每次连接时都需要为整个字符串分配和复制内存。 【参考方案1】:如果您删除逗号,它将起作用。列出了多个主机,它们之间只有一个空格。
使用示例:
import nmap
nm = nmap.PortScanner()
hostlist = ' '.join(nm.all_hosts())
nm.scan(hosts=hostlist, arguments='-n -sP -PE')
【讨论】:
好吧,我不觉得有点迟钝...我怎么会忘记呢?当我以艰难的方式进行扫描时,我从不输入逗号,不知道为什么我认为在编写 python 时我需要它们。奇怪的心理故障,谢谢 Banana。 @Arvandor 乐于助人! 下一个问题是 -PN 似乎无法在 Python 中正确输出......它没有得到实际结果,只有似乎是它正在尝试的扫描的信息。我可以使用不同的开关来查看哪些主机上打开了哪些端口? @Arvandor -PN 表示“跳过主机发现”,因此-sP -PN
是无操作的(“只进行主机发现,但跳过主机发现并假设一切正常”)。奇怪的是,-PE
覆盖了-Pn
,但不要依赖这种行为:它是未定义的并且可能会改变,因为我不同意它。
我没有做 -sP -PN,只是 -PN,所以 nm.command_line() 看起来像“-oX - -PN”。我似乎确实让它以我想要的方式工作,至少运行一次,并尝试将值转储到 mysql 数据库中,这也有效,但也许我应该为这个新问题启动一个新线程......现在我考虑了一下。以上是关于使用 python nmap 模块扫描从先前扫描生成的主机的主要内容,如果未能解决你的问题,请参考以下文章
python学习-python-nmap实现高效的端口扫描器