Переменные подпроцессора

  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)

Итак, это мой script. Я все работает, кроме одной ключевой цели, используя исходный вход. Это позволяет мне вводить все, что я хочу, но когда он идет на сохранение файла или с помощью ip/host doe, на самом деле ничего не делает. Конечно, он дает мне пакеты, но из локального хоста не я вхожу в хост.

как я знаю, что это не работает, потому что мой первый исходный вход - это имя файла, поэтому я поставил тест, когда я смотрел в папке, был мой script, он создает файл с названием "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" s input. для справки это то, что команда выглядит в терминале:

tcpdump -c5 -vvv -w savename host wiki2

только две переменные - это сакраменто и wiki2, остальные нужны для работы команды.

с этим script я получите эту ошибку:

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

Я потерялся. Любая помощь будет большой, да, я знаю, посмотрите на подпроцесс doc на сайте: X, мне нужен человек, чтобы научить меня, я не понимаю, что я читаю.

Мой вопрос в том, как я могу работать с этими переменными.

Ответы

Ответ 1

Не используйте 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

Теперь это должно сработать.

Ответ 2

Вы не должны использовать строковую форму ob subprocess. Попробуйте:

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