用变量调用python中的nc / netcat

时间:2013-09-16 02:42:11

标签: python netcat

我试图从循环内部调用netcat / nc,将lcv作为命令中的最后一个八位字节传递。由于变量位于命令的中间,我似乎遇到了问题。我想做的是:

for i in 1 to 50
   print i
   nc -nvv 192.168.1.i 21 -w 15 >> local_net.txt

到目前为止,我已经尝试过:

os.system("nc -nvv 192.168.1.",i,"21 -w 15 >> local_net.txt")

subprocess.call(["nv","-nvv 192.168.1.",i,"21 -w 15 >> local_net.txt")

是否有更简单的方法从执行系统命令的命令中引用LVC?

1 个答案:

答案 0 :(得分:5)

这不起作用的原因:

os.system("nc -nvv 192.168.1.",i,"21 -w 15 >> local_net.txt"

...是os.system接受一个字符串,作为shell命令。你给它三个不同的论点。 (另外,即使这样按照您的意愿工作,也必须在i之前放置一个空格,或者在i之后放置一个空格。)您可以通过任何常用的方式修复它。结合字符串:

os.system("nc -nvv 192.168.1.{} 21 -w 15 >> local_net.txt".format(i))

os.system("nc -nvv 192.168.1." + str(i) + " 21 -w 15 >> local_net.txt".format(i))

然而,你尝试subprocess.call的直觉是一个很好的直觉。这不起作用的原因:

subprocess.call(["nv","-nvv 192.168.1.",i,"21 -w 15 >> local_net.txt")

......是双重的。

首先,你加入了多个参数。这相当于shell命令:

nc '-nvv 192.168.1.' '1' '21 -w 15 >> local_net.txt'

当你想要的东西相当于:

nc -nvv 192.168.1.1 21 -w 15 >> local_net.txt
nc '-nvv' '192.168.1.1' '21' '-w' '15' >> 'local_net.txt'

你需要正确地拆分参数才能得到它。

其次,>> local_net.txt根本不是命令本身的一部分;它是一个shell重定向指令。没有shell你不能这样做。

如果你真的想要使用shell,你可以像使用system那样使用它,但是将它组合在一起:

subprocess.call("nc -nvv 192.168.1.{} 21 -w 15 >> local_net.txt".format(i), shell=True)

但更好的方法是正确地破解参数,并执行重定向Python风格而不是shell风格:

with open('local_net.txt', 'a+b') as f:
    subprocess.call(["nc", "-nvv", "192.168.1.{}".format(i), "21", "-w", "15"],
                    stdout=f)

在文件模式下,a表示附加到文件末尾; +表示更新文件(如果存在),否则创建; b意味着以二进制模式打开它(所以你不翻译换行符,如果这是Windows - 我在这里假设Python 2.x)。


同时,for i in 1 to 50的Python版本为for i in range(1, 51):。 (注意最后是51,因为Python范围是半开的。)所以,把它们放在一起:

for i in range(50):
    with open('local_net.txt', 'a+b') as f:
        subprocess.call(["nc", "-nvv", "192.168.1.{}".format(i), "21", "-w", "15"],
                        stdout=f)

值得注意的是,你可以在大多数类似于sh的shell中执行此操作,包括bash,而根本不需要Python。对于这个简单的事情,它可能更容易:

for i in {1..50}; do
    nc -nvv 192.168.1.${i} 21 -w 15 >> local_net.txt
done