终端使用python的多个参数

时间:2014-02-18 17:05:30

标签: python subprocess

我可以使用os.system正确运行它。它正在将pcap文件写入文本。

os.system("tshark -z 'proto,colinfo,tcp.srcport,tcp.srcport' -r filename.pcap > testfile")

但是当我尝试从termimal提供输入文件时,我得到以下错误: tshark:-z无效参数

host = raw_input("Enter file name: ")   
test = subprocess.Popen(["tshark","-z","'proto,colinfo,tcp.srcport,tcp.srcport'","-r",host,">","testfile"], stdout=subprocess.PIPE)
output = test.communicate()[0]

任何人都可以弄明白我在哪里弄错了吗?

1 个答案:

答案 0 :(得分:2)

要模拟os.system命令,请使用shell=True参数subprocess.Popen并提供相同的命令字符串(不是字符串数组):

subprocess.Popen("tshark -z 'proto,colinfo,tcp.srcport,tcp.srcport' -r " 
                 + host + "> testfile", stdout=subprocess.PIPE, shell=True)

当您使用输出重定向到文件(“> testfile”)时,需要一个shell来解释您的命令行。

在您的示例中,您将字符串列表的每个元素传递给execve()系统调用,因此作为tshark命令的参数(将'proto,colinfo,tcp.srcport,tcp.srcport'作为-z的参数传递给proto,colinfo,tcp.srcport,tcp.srcport 1}}选项而不是>,而且不知道如何处理testfileos.system参数。)

正如wnnmaw在他的评论中指出的那样,使用subprocess.Popenshell=Truehost一起使用从用户输入构建的命令行(在您的案例中为host变量)允许用户将任意数据传递给shell。这可用于在您的系统上执行(可能令人讨厌的)命令。

例如,将示例中的; /bin/rm -rf /设置为{{1}}将删除UNIX系统上的每个文件(假设运行该进程的用户具有足够的权限)。

因此,在将用户输入添加到命令字符串之前验证用户输入非常重要。