内部でネットワークまたはファイアウォールの問題が発生し、使用中のIPアドレスを見つけるためにネットワークスキャンが必要になる場合があります。そのために、nmap、zmap、angryIPなどの既製のツールを使用できます。ただし、これらのツールをダウンロードするためのインターネットアクセスがない場合は、手動コマンドを使用するだけでスキャンを実行できます。ただし、手動スキャンは非常に面倒な場合があり、ネットワーク上で指定されたIPアドレスごとに実行する必要があることを理解しています。
上記を考慮して、このチュートリアルでは、Pythonを使用してこのタスクを自動化する方法を示します。Pythonは、市場で入手可能なほぼすべてのLinuxディストリビューションで利用できることを知っています。
Pythonは、OSが実行できるすべてのタスクを自動化できるため、これに最適です。正しいライブラリを使用するだけで済みます。
PythonでのLinuxライブラリの使用
現在の調査の焦点は、ネットワーク上で接続され、電源がオンになっているすべての機器を検出するpingスイープコマンドです。作成しているスクリプトは、ネットワーク上の各IPアドレスにpingを実行します。たとえば、サブネットマスク/ 24を使用すると、IPの最初の3オクテットのみをループします。このスクリプトで最初に考慮しなければならないのは、タスクに使用できるシステムライブラリであり、sysライブラリとサブプロセスライブラリをインポートする必要があります。これらのライブラリを使用すると、Pythonインタープリターとオペレーティングシステム自体(この場合はScientific Linux 7.1)の特定のコマンドを使用できます。
import sys, subprocess
スクリプトをnetworkmonitor.pyという名前で保存します。
コマンド
を使用してスクリプトを実行する場合>> pythonnetworkmonitor.py10.0.0。
シェルでは、コマンドの引数が間違っている場合(len(sys.argv)<> 2 :)、スクリプトは正しい例を表示します。 (「networkmonitor.py10.0.0」を出力します。)
引数はスキャンされたサブネットのIPアドレスであり、最初の3オクテットのみが使用されます。したがって、引数が正しければ、コマンド「ping-c1」+sys.argv[1]の結果が変数に格納されます。この場合はcmdpingであり、sys.argv[1]は「引数」変数です。 sysモジュールにあり、スクリプトに指定された最初の引数を格納します。 UNIX環境では、pingコマンドが無限に実行されるため、ping-c1を使用する必要があります。
if len(sys.argv)<>2:
print "networkmonitor 10.0.0."
サブプロセスコマンド、その引数、およびforループ
次の行でforループが開始され、設定した制限(停止条件)に達するまで実行されます。条件は、スキャンするIP範囲です。この時点で、スクリプトが範囲をスキャンする必要がある時間を考慮することが重要です。範囲が大きいほど、スクリプトの実行時間が長くなります。 subprocess.Popenを使用すると、シェルコマンドを起動して、終了するまで待つことができます。完了すると、コマンドが返された状態を確認します。サブプロセスによって実行されるcmdping+str(x)。
shell =trueは、プロセスがシェルで実行されることを意味します。ただし、PythonドキュメントのWebサイトでは、shell =trueを使用することの危険性について警告されているため、実行するコマンドに注意してください。 stderr引数として使用するsubprocess.PIPEは、Pythonが標準ストリームへのパイプを開くことを示します。
for x in range(99,110):
p = subprocess.Popen(cmdping+str(x), shell=True, stderr=subprocess.PIPE)
この場合、テストしたIPアドレスは11個(99から110)のみです。
ここで、stderrの内容を確認する必要があります。変数が空の場合は停止(中断)します。それ以外の場合は、stdoutを表示します。 コンテンツ。
out = p.stderr.read(1)
if out == '' and p.poll() != None:
break
if out != '':
sys.stdout.write(out)
sys.stdout.flush()
シェルが真の状態のままである場合は、この最後のコードを実行する必要があります。
完全なコードは次のようになります:
import sys, subprocess
if len(sys.argv)<>2:
print "networkmonitor 10.0.0."
else:
cmdping ="ping -c1 "+sys.argv[1]
for x in range(99,110):
p = subprocess.Popen(cmdping+str(x), shell=True, stderr=subprocess.PIPE)
while True:
out = p.stderr.read(1)
if out == '' and p.poll() != None:
break
if out != '':
sys.stdout.write(out)
sys.stdout.flush()
小さなスクリプトの出力は次のとおりです。
スクリーンショットに示されているように、ツールはpingを実行して正または負の回答を取得し、次のIPアドレスに移動するなど、アドレス範囲全体を分析します。
上記で分析したコードの作成者を主張するものではないことに注意してください。システムコマンドとネットワーク機能をよりよく理解するために、その機能を段階的に説明しています。著者の功績を称えます。