2

我试图从循环内部调用 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?

4

1 回答 1

6

这不起作用的原因:

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,你可以用与 with 相同的方式来做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)。


同时,Python 版本for i in 1 to 50for 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
于 2013-09-16T02:58:32.333 回答