web-dev-qa-db-ja.com

サブプロセス変数

  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)

これが私のスクリプトです。私は、生の入力を使用して、1つの主要な目的以外にすべてが機能します。それは私が欲しいものを何でも入力することを可能にします、しかしそれがファイルを保存するか、またはip/Host doeを使用することになるとき、実際には何もしません。確かにそれは私にパケットを与えますが、ローカルホストからではなく、ホストiが入力します。

これが機能していないことをどのように知っているかは、最初のraw入力がファイル名であるためです。テストを行ったところ、スクリプトが含まれているフォルダーを調べると、「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を必要とするので素晴らしいですが、「raw」入力ではなくrawhostipとして保存されるようになりました。参考までに、これはターミナルでのコマンドの外観です。

tcpdump -c5 -vvv -w savename Host wiki2

コマンドが機能するために必要なのは、savenameとwiki2の2つの変数だけです。

このスクリプトを使用すると、次のエラーが発生します。

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、私は私に教えるために人間が必要です、私は私が読んでいるものを理解していません。

私の質問は、これらの変数をどのように扱うかです。

14
John Riselvato

Shell=Trueは使用しないでください。それはFalseである必要があります。

入力に微妙な間違いを犯しています。具体的には、2つの文字列がある場合:

>>> 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

これで動作するはずです。

28
user225312

subprocess関数の文字列形式は使用しないでください。試してみてください:

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