【问题标题】:Subprocess Variables [duplicate]子流程变量 [重复]
【发布时间】:2011-05-19 21:51:20
【问题描述】:
  1 import subprocess
  2 raw = raw_input("Filename:").lower()
  3 ip = raw_input("Host:").lower()
  4 cmd = subprocess.call("tcpdump -c5 -vvv -w" + " raw " + " ip ",shell=True)

所以这是我的脚本。除了一个关键目标之外,我一切都有效,使用原始输入。 它允许我输入我想要的任何内容,但是当它保存文件或使用 ip/host 时,doe 实际上并没有做任何事情。 当然它给了我数据包,但来自本地主机而不是我输入的主机。

我怎么知道这不起作用是因为我的第一个原始输入是文件名,所以我进行了测试,当我在文件夹中查看我的脚本时,它会生成一个名为“原始”的文件,意思是,它不是实际上只使用我的“X”中的内容来接受我的输入......

所以我有几个机会来这里:

  1 import subprocess
  2 raw = raw_input("Filename:").lower()
  3 ip = raw_input("Host:").lower()
  4 cmd = subprocess.call("tcpdump -c5 -vvv -w" + raw + "host" + ip,shell=True)

这很棒,因为它实际上需要 -w,但它现在将其保存为 rawhostip 而不是“raw”的输入。 作为参考,这是命令在终端中的样子:

tcpdump -c5 -vvv -w savename host wiki2

仅有的两个变量是 savename 和 wiki2,其余的都是命令工作所必需的。

使用这个脚本我得到这个错误:

import subprocess
raw = raw_input("Filename:").lower()
ip = raw_input("Host:").lower()
cmd = subprocess.call("tcpdump -c5 -vvv -w" + raw, "host" + ip,shell=True)

错误:

Traceback (most recent call last):
  File "te.py", line 4, in <module>
    cmd = subprocess.call("tcpdump -c5 -vvv -w" + raw, "host" + ip,shell=True)
  File "/usr/lib/python2.6/subprocess.py", line 480, in call
    return Popen(*popenargs, **kwargs).wait()
  File "/usr/lib/python2.6/subprocess.py", line 583, in __init__
    raise TypeError("bufsize must be an integer")
TypeError: bufsize must be an integer

我迷路了。任何帮助都会很棒,是的,我知道在现场查看 subprocess 的文档:X,我需要一个人来教我,我不明白我在读什么。

我的问题是如何处理这些变量。

【问题讨论】:

    标签: python subprocess tcpdump


    【解决方案1】:

    您不应该使用subprocess 函数的字符串形式。试试:

    subprocess.check_call(["tcpdump", "-c5", "-vvv", "-w", raw, "host", ip])
    

    【讨论】:

      【解决方案2】:

      不要使用shell=True。那应该是False

      您在输入时犯了一些细微的错误。具体来说,如果你有两个字符串:

      >>> s1 = 'Hello'
      >>> s2 = 'Hi'
      >>> s1 + s2
      'HelloHi'
      

      注意,HelloHi 之间没有空格。所以不要这样做。 (你的第 4 行)

      你应该这样做(好方法):

      >>> raw = raw_input('Filename: ')
      Filename: test
      >>> ip = raw_input('Host: ')
      Host: 192.168.1.1 
      >>> command = 'tcpdump -c5 -vvv -w {0} {1}'.format(raw, ip)   # the command goes here
      >>> subprocess.call(command.split(), shell=False)   # call subprocess and pass the command as a list using split
      

      现在应该可以了。

      【讨论】:

      • 天哪,苏克比尔! :D 好吧,我还没有测试它,但现在我终于明白了这些 {0} {1} 东西放在示例中的命令中。它们是表格/列表,对吗?我知道不要使用 shell=True,这是一个安全问题。我不知道 False 不是感谢您向我展示了这一点。让我测试一下吧 brb
      • 好吧,我很确定文件名可以正常工作,但其中不正确的一件事是调用“主机”,没有 python 的命令是:tcpdump -c5 -vvv -w test host 192.168 .1.1 我在你的例子中使用你的变量
      • 我已经给你基本的大纲了,剩下的就给你看吧!实验!
      • 我会在 40 分钟后回来,我的进度:D 谢谢 sukhbir
      • 一旦raw 包含空格,这将停止工作。完全不要使用命令行字符串,而是直接使用列表。
      猜你喜欢
      • 1970-01-01
      • 2018-04-20
      • 2011-05-29
      • 2016-11-23
      • 1970-01-01
      • 2018-06-20
      • 2014-07-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多