Поиск по сайту:

Узнайте, как обнаруживать сетевое оборудование с помощью Scientific Linux 7.1 и Python


На этой странице

  1. Использование библиотек Linux в Python
  2. Определение правильного аргумента
  3. цикл

Иногда у вас могут быть внутренние проблемы с сетью или брандмауэром, которые требуют сканирования сети, чтобы определить, какие IP-адреса используются. Для этого мы можем использовать готовые инструменты, такие как nmap, zmap или angryIP. Но если у нас нет доступа в Интернет для загрузки этих инструментов, мы можем выполнить сканирование, используя только ручные команды. Однако ручное сканирование может быть довольно утомительным, если понимать, что это следует делать для каждого IP-адреса, указанного в нашей сети.

Принимая во внимание вышеизложенное, я покажу в этом руководстве, как мы можем автоматизировать эту задачу с помощью Python, зная, что Python доступен почти во всех дистрибутивах Linux, доступных на рынке.

Python — идеальный выбор для этого, потому что он позволяет нам автоматизировать каждую задачу, которую может выполнить ОС, нам просто нужно использовать правильные библиотеки.

Использование библиотек Linux в Python

Основное внимание в нашем текущем исследовании уделяется команде проверки связи для обнаружения всего подключенного и включенного оборудования в нашей сети. Сценарий, который мы создаем, отправляет эхо-запрос на каждый IP-адрес в сети. Например, мы используем маску подсети/24, она будет проходить только через первые 3 октета IP. Первое, что мы должны рассмотреть для этого скрипта, это какие системные библиотеки можно использовать для задачи, мы должны импортировать библиотеки sys и subprocess. Эти библиотеки позволяют использовать определенные команды интерпретатора Python и самой операционной системы, в данном случае Scientific Linux 7.1.

import sys, subprocess

Я сохраню свой скрипт под именем networkmonitor.py.

Обнаружение правильного аргумента

Когда мы запускаем скрипт с помощью команды

>> сетевой монитор Python.py 10.0.0.

в оболочке, если аргумент команды неверен (если len(sys.argv)<>2:), скрипт отобразит правильный пример. (напечатайте \networkmonitor.py 10.0.0.\).

Аргументом является IP-адрес сканируемой подсети, используются только первые 3 октета. Так что если аргумент правильный, то результат команды \ping -c1\+sys.argv[1] будет сохранен в переменной, в нашем случае это cmdping, sys.argv[1] это\arguments\ в модуле sys и сохранит первый аргумент, переданный сценарию. В средах UNIX мы должны использовать ping -c1, потому что команда ping будет выполняться бесконечно.

if len(sys.argv)<>2:
    print "networkmonitor 10.0.0."

Команда подпроцесса, ее аргументы и цикл for


В следующей строке запускается цикл for, который выполняется до тех пор, пока не будет достигнуто ограничение (условие остановки), которое мы для него установили, условием является диапазон IP-адресов, который мы хотим сканировать. На этом этапе важно учитывать время, необходимое скрипту для сканирования диапазона, чем больше диапазон, тем дольше будет работать скрипт. Subprocess.Popen позволяет нам запустить команду оболочки и дождаться ее завершения. После завершения мы проверяем состояние, которое вернула команда. Команда cmdping+str(x), выполняемая подпроцессом.Popen,  увеличивает индекс для IP-адреса, заданного аргументом, в каждом цикле цикла for .

Shell=true означает, что процесс будет выполняться в оболочке. Однако веб-сайт документов Python предупреждает об опасности использования shell=true, поэтому будьте осторожны, какую команду вы выполняете. Использование subprocess.PIPE в качестве аргумента stderr указывает, что Python должен открыть канал для стандартного потока.

for x in range(99,110):
        p = subprocess.Popen(cmdping+str(x), shell=True, stderr=subprocess.PIPE)

В данном случае мы протестировали только одиннадцать IP-адресов (от 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()

Вывод нашего небольшого скрипта:



Как показано на снимке экрана, инструмент выполняет проверку связи только для получения положительного или отрицательного ответа, а затем переходит к следующему IP-адресу и т. д. для анализа всего диапазона адресов.

Следует отметить, что я не претендую на авторство проанализированного выше кода. Я просто шаг за шагом объясняю его функциональность, чтобы лучше понять системные команды и сетевые функции. Я отдаю должное автору.