使用python来自终端的多个参数

2024-03-28 15:37:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我可以使用操作系统. 它正在将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]

有人能找出我犯的错误吗?你知道吗


Tags: 文件test文本hostos错误pcapsystem
1条回答
网友
1楼 · 发布于 2024-03-28 15:37:32

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

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

您需要一个shell来解释命令行,因为您正在使用文件的输出重定向(“>;testfile”)。你知道吗

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

正如wnnmaw在他的评论中指出的,使用os.systemsubprocess.Popenshell=True以及从用户输入构建的命令行(在您的例子中是host变量)允许用户向shell传递任意数据。这可用于在系统上执行(可能是讨厌的)命令。你知道吗

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

因此,在将用户输入添加到命令字符串之前验证它是非常重要的。你知道吗

相关问题 更多 >