我可以使用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]
任何人都可以弄明白我在哪里弄错了吗?
答案 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}}选项而不是>
,而且不知道如何处理testfile
和os.system
参数。)
正如wnnmaw在他的评论中指出的那样,使用subprocess.Popen
或shell=True
与host
一起使用从用户输入构建的命令行(在您的案例中为host
变量)允许用户将任意数据传递给shell。这可用于在您的系统上执行(可能令人讨厌的)命令。
例如,将示例中的; /bin/rm -rf /
设置为{{1}}将删除UNIX系统上的每个文件(假设运行该进程的用户具有足够的权限)。
因此,在将用户输入添加到命令字符串之前验证用户输入非常重要。