2

コマンドの最後のオクテットとして lcv を渡して、ループ内から netcat/nc を呼び出そうとしています。変数がコマンドの途中にあるため、問題が発生しているようです。私がやりたいことは次のとおりです。

for i in 1 to 50
   print i
   nc -nvv 192.168.1.i 21 -w 15 >> local_net.txt

これまでのところ、私は試しました:

os.system("nc -nvv 192.168.1.",i,"21 -w 15 >> local_net.txt")

subprocess.call(["nv","-nvv 192.168.1.",i,"21 -w 15 >> local_net.txt")

システムコマンドを実行するコマンド内から LVC を参照する簡単な方法はありますか?

4

1 に答える 1

6

これが機能しない理由:

os.system("nc -nvv 192.168.1.",i,"21 -w 15 >> local_net.txt"

os.systemシェルコマンドとして、単一の文字列を取ります。あなたはそれに3つの別々の引数を与えています。(さらに、これが期待どおりに機能したとしても、 の前にスペースをi入れるか、の後にスペースを入れないかのどちらかでなければなりませんi。) 文字列を結合する通常の方法のいずれかで修正できます。

os.system("nc -nvv 192.168.1.{} 21 -w 15 >> local_net.txt".format(i))

os.system("nc -nvv 192.168.1." + str(i) + " 21 -w 15 >> local_net.txt".format(i))

しかし、代わりに試してみようとするあなたの直感subprocess.callは良いものでした。これが機能しない理由:

subprocess.call(["nv","-nvv 192.168.1.",i,"21 -w 15 >> local_net.txt")

… 二重です。

まず、複数の引数を結合しています。これは、次のシェル コマンドと同等です。

nc '-nvv 192.168.1.' '1' '21 -w 15 >> local_net.txt'

必要なものがこれらと同等の場合:

nc -nvv 192.168.1.1 21 -w 15 >> local_net.txt
nc '-nvv' '192.168.1.1' '21' '-w' '15' >> 'local_net.txt'

それを得るには、引数を適切に分割する必要があります。

次に、>> local_net.txtコマンド自体の一部ではありません。これはシェルのリダイレクト ディレクティブです。シェルがないとできません。

本当にシェルを使用したい場合は、 と同じ方法で行うことができますがsystem、単一の単一のものをまとめます。

subprocess.call("nc -nvv 192.168.1.{} 21 -w 15 >> local_net.txt".format(i), shell=True)

しかし、これを行うためのより良い方法は、引数を適切に分割し、シェル スタイルではなく Python スタイルのリダイレクトを行うことです。

with open('local_net.txt', 'a+b') as f:
    subprocess.call(["nc", "-nvv", "192.168.1.{}".format(i), "21", "-w", "15"],
                    stdout=f)

ファイルモードではa、ファイルの末尾に追加する手段。+ファイルが存在する場合は更新し、存在しない場合は作成する手段。bバイナリモードで開く手段 (これが Windows の場合、改行を変換しません。ここでは Python 2.x を想定しています) 。


一方、 の Python バージョンfor i in 1 to 50for i in range(1, 51):. (Python の範囲は半分開いているため、最後に注意してください51。) したがって、すべてをまとめると、次のようになります。

for i in range(50):
    with open('local_net.txt', 'a+b') as f:
        subprocess.call(["nc", "-nvv", "192.168.1.{}".format(i), "21", "-w", "15"],
                        stdout=f)

Python をまったく必要とせずに、bash を含むほとんどの sh のようなシェルでこれを実行できることに注意してください。そして、これほど単純なものについては、次のほうが簡単かもしれません。

for i in {1..50}; do
    nc -nvv 192.168.1.${i} 21 -w 15 >> local_net.txt
done
于 2013-09-16T02:58:32.333 に答える