14
  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を使用することになるとき、実際には何もしません。確かにそれは私にパケットを与えますが、ローカルホストから私が入力したホストではありません。

これが機能していないことをどのように知っているかは、最初の生の入力がファイル名であるためです。テストを行ったところ、スクリプトがあったフォルダーを見ると、「生」という意味のファイルが生成されますが、実際には私の「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

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

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

4

2 に答える 2

28

使用しないでくださいshell=True。それはそうあるべきですFalse

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

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

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

于 2010-12-03T18:26:20.210 に答える
24

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

subprocess.check_call(["tcpdump", "-c5", "-vvv", "-w", raw, "host", ip])
于 2010-12-03T18:48:21.490 に答える