これが機能しない理由:
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 50
はfor 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