【发布时间】: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 以及可能大多数其他语言中,使用连接构建长字符串是不好的。每次连接时都需要为整个字符串分配和复制内存。