Переменные подпроцесса - PullRequest
15 голосов
/ 03 декабря 2010
  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, на самом деле ничего не происходит. Конечно, это дает мне пакеты, но с локального хоста, а не с хоста, который я ввожу.

откуда я знаю, что это не работает, потому что мой первый необработанный ввод - это имя файла, поэтому я проверяю, когда я смотрю в папку, где находится мой скрипт, он создает файл с именем «raw», это не так на самом деле, принимая мой ввод, используя только то, что внутри моего "Х" ...

Так что у меня есть несколько шансов прийти к этому:

  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

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

У меня вопрос, как мне работать с этими переменными.

Ответы [ 2 ]

28 голосов
/ 03 декабря 2010

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

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

24 голосов
/ 03 декабря 2010

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

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