GNU/Linux >> Linux の 問題 >  >> Linux

ScientificLinux7.1とPythonを使用してネットワーク機器を検出する方法を学ぶ

内部でネットワークまたはファイアウォールの問題が発生し、使用中の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)。 Popen forループの各サイクルで引数によって指定されたIPのインデックスを増やします。

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アドレスに移動するなど、アドレス範囲全体を分析します。

上記で分析したコードの作成者を主張するものではないことに注意してください。システムコマンドとネットワーク機能をよりよく理解するために、その機能を段階的に説明しています。著者の功績を称えます。


Linux
  1. Linux上のFlatpak:それは何であり、それを使ってアプリをインストールする方法

  2. LinuxでPyenvを使用して複数のPythonバージョンを管理する方法

  3. Linuxでファイルを圧縮および解凍する方法を学び、Zipマスターになる

  1. LinuxにPythonをインストールする方法

  2. Linuxで静的IPアドレスを設定してネットワークを構成する方法

  3. Linux 上の Python で export を使用する方法

  1. LinuxでSUIDおよびSGID権限を持つファイルを検索する方法

  2. Pythonスクリプトを使用したScientificLinux7.1のベクトル代数:パート1

  3. Linuxでユーザーとグループを操作する方法