子流程变量

Joh*_*ato 15 python subprocess tcpdump

  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)
Run Code Online (Sandbox Code Playgroud)

所以这是我的剧本.除了一个关键目标,我使用原始输入一切正常.它允许我输入我想要的任何东西,但是当它用于保存文件或使用ip/host时,doe实际上并没有做任何事情.当然它给了我数据包,但是从localhost而不是我输入的主机.

我怎么知道这不起作用是因为我的第一个原始输入是文件名,所以我放入测试,当我在文件夹中查看我的脚本是,它产生一个名为"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)
Run Code Online (Sandbox Code Playgroud)

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

tcpdump -c5 -vvv -w savename host wiki2
Run Code Online (Sandbox Code Playgroud)

只有两个变量是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)
Run Code Online (Sandbox Code Playgroud)

错误:

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
Run Code Online (Sandbox Code Playgroud)

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

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

use*_*312 28

不要用shell=True.那应该是False.

你在输入时犯了微妙的错误.具体来说,如果你有两个字符串:

>>> s1 = 'Hello'
>>> s2 = 'Hi'
>>> s1 + s2
'HelloHi'
Run Code Online (Sandbox Code Playgroud)

请注意,Hello和之间没有空格Hi.所以不要这样做.(你的第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
Run Code Online (Sandbox Code Playgroud)

现在它应该工作.

  • 哦天哪Sukhbir!:D嗯,我还没有测试过,但现在我终于理解了这些{0} {1}在示例中输入命令的内容.他们是桌子/名单对吗?我知道不要使用shell = True,这是一个安全问题.我不知道False不是因为向我展示了这一点.让我测试它生病了 (2认同)

Phi*_*ipp 24

你不应该使用subprocess函数的字符串形式.尝试:

subprocess.check_call(["tcpdump", "-c5", "-vvv", "-w", raw, "host", ip])
Run Code Online (Sandbox Code Playgroud)