Узнайте, как обнаруживать сетевое оборудование с помощью Scientific Linux 7.1 и Python
На этой странице
- Использование библиотек Linux в Python
- Определение правильного аргумента
- цикл
Иногда у вас могут быть внутренние проблемы с сетью или брандмауэром, которые требуют сканирования сети, чтобы определить, какие 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), выполняемая подпроцессом.
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-адресу и т. д. для анализа всего диапазона адресов.
Следует отметить, что я не претендую на авторство проанализированного выше кода. Я просто шаг за шагом объясняю его функциональность, чтобы лучше понять системные команды и сетевые функции. Я отдаю должное автору.