子进程变量
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'
注意,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
现在应该可以正常工作了。