子进程变量

14 投票
2 回答
33630 浏览
提问于 2025-04-16 07:59
  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/主机时,实际上并没有做任何事情。没错,它给了我数据包,但是从本地计算机而不是我输入的主机。

我知道这不工作的原因是因为我的第一个原始输入是文件名,所以我输入了“test”,当我查看脚本所在的文件夹时,它生成了一个名为“raw”的文件,这意味着它实际上没有使用我的输入,只是用了我“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的文档,我看过了,我需要一个人来教我,我不理解我在读什么。

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

2 个回答

24

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

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

不要使用 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

现在应该可以正常工作了。

撰写回答