2010-12-03 4 views
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、私は私に教える人間が必要です、私は何を読んでいるのか分かりません。

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

+0

質問は何ですか? –

答えて

27

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

入力を微妙に間違えています。あなたは二つの文字列があれば具体的には、:

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

今では動作するはずです。

+2

ああゴッシュSukhbir! :Dまあ私はまだそれをテストしていないが、今、私は最終的にこれらの{0} {1}の事柄を例文に入れていることを理解しています。彼らはテーブル/リストの権利ですか? shell = Trueを使用しないことを知っていましたが、これはセキュリティ上の問題です。私は偽を知っていませんでした私にそれを示してくれてありがとうございました。 –

+0

私はファイル名が正しく動作していると確信していますが、これで正しくないことの1つは "ホスト"です。 tcpdump -c5 -vvv -w testホスト192.168.1。1 私はあなたの例であなたの変数を使用しています –

+0

私はちょうどあなたに基本的な概要を与えている、残りはあなたがそれをチェックアウトするためです!実験! – user225312

24

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

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

このアプローチについて+1ポイントを取った。 – user225312

関連する問題