GNU/Linux >> Znalost Linux >  >> Linux

Naučte se detekovat síťové vybavení pomocí Scientific Linux 7.1 a Python

Někdy můžete mít problémy se sítí nebo firewallem v interním zařízení, které vyžaduje skenování sítě, aby se zjistilo, které adresy IP se používají. K tomuto účelu můžeme použít hotové nástroje, jako je nmap, zmap nebo angryIP. Ale pokud nemáme přístup k internetu ke stažení těchto nástrojů, můžeme skenovat pouze pomocí ručních příkazů. Manuální skenování však může být docela únavné, s tím, že by se mělo provádět pro každou IP adresu uvedenou v naší síti.

Vezmeme-li v úvahu výše uvedené, v tomto tutoriálu ukážu, jak můžeme tento úkol automatizovat pomocí Pythonu, protože vím, že python je dostupný téměř ve všech distribucích Linuxu dostupných na trhu.

Python je pro to perfektní volbou, protože nám umožňuje automatizovat každou úlohu, kterou může OS provést, jen musíme používat správné knihovny.

Použití Linuxových knihoven v Pythonu

Naše aktuální studie se zaměřuje na příkaz ping sweep, který detekuje všechna připojená a zapnutá zařízení v naší síti. Skript, který vytváříme, provede ping na každou IP adresu v síti. Například použijeme masku podsítě / 24, bude smyčka pouze přes první 3 oktety IP. První věc, kterou musíme u tohoto skriptu zvážit, je, které systémové knihovny lze pro úlohu použít, musíme importovat knihovny sys a subprocess. Tyto knihovny umožňují použití specifických příkazů interpretu pythonu a samotného operačního systému, v tomto případě Scientific Linux 7.1.

import sys, subprocess

Svůj skript uložím pod názvem networkmonitor.py.

Detekce správného argumentu

Když skript spustíme pomocí příkazu

>>python networkmonitor.py 10.0.0.

v shellu, pokud je argument v příkazu  nesprávný (pokud len(sys.argv)<>2:), skript zobrazí správný příklad. (vytiskněte "networkmonitor.py 10.0.0.").

Argumentem je IP adresa skenované podsítě, použijí se pouze první 3 oktety. Pokud je tedy argument správný, pak bude výsledek příkazu "ping -c1 "+sys.argv[1] uložen do proměnné, v našem případě je to cmdping,  sys.argv[1] je proměnná "argument" v modulu sys a uloží první argument daný skriptu. V prostředí UNIX musíme použít ping -c1, protože příkaz ping by běžel donekonečna.

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

Příkaz podprocesu, jeho argumenty a cyklus for


Na dalším řádku začíná cyklus for, který se provádí, dokud nedosáhne limitu (podmínka zastavení), který jsme mu nastavili, podmínkou je rozsah IP, který chceme skenovat. V tomto okamžiku je důležité vzít v úvahu čas, který skript potřebuje ke skenování rozsahu, čím větší je rozsah, tím déle bude skript běžet. Subprocess.Popen  nám umožňuje spustit příkaz shellu a počkat, až skončí. Po dokončení zkontrolujeme stav, který příkaz vrátil. Cmdping+str(x) provedené podprocesem.Popen , zvyšuje index pro IP daný argumentem v každém cyklu cyklu for.

Shell=true znamená, že proces bude proveden na shellu. Webové stránky dokumentů Pythonu však varují před rizikem použití shell=true, takže buďte opatrní, který příkaz spustíte. Argument subprocess.PIPE používající jako stderr označuje, že Python otevře kanál do standardního streamu.

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

V tomto případě jsme testovali pouze jedenáct IP adres (od 99 do 110).

Nyní musíme zkontrolovat obsah stderr, zastavíme (přerušíme), když je proměnná prázdná, jinak zobrazíme stdout  obsah.

out = p.stderr.read(1)
            if out == '' and p.poll() != None:
                break
            if out != '':
                sys.stdout.write(out)
                sys.stdout.flush()

Tento poslední kód se musí spustit, pokud shell zůstane ve skutečném stavu.

Úplný kód je nyní:

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()

Výstup našeho malého skriptu je:



Jak je znázorněno na snímku obrazovky, nástroj provede pouze ping, aby získal kladnou nebo zápornou odpověď, a poté se přesune na další IP adresu a tak dále, aby analyzoval celý rozsah adres.

Je třeba zmínit, že si nečiním nárok na autorství výše analyzovaného kódu. Jen vysvětluji jeho funkčnost krok za krokem, abych lépe porozuměl systémovým příkazům a síťovým funkcím. Poděkuji autorovi.


Linux
  1. Jak nastavit statickou IP adresu a nakonfigurovat síť v Linuxu

  2. Jak najít soubory s oprávněními SUID a SGID v Linuxu

  3. Vektorová algebra na Scientific Linux 7.1 s Python Script:Část 1

  1. Jak nainstalovat Python na Linux

  2. Jak spravovat více verzí Pythonu pomocí Pyenv v systému Linux

  3. Jak monitorovat využití sítě pomocí nload v Linuxu?

  1. Flatpak na Linuxu:Co to je a jak s ním instalovat aplikace

  2. Jak pracovat s uživateli a skupinami v Linuxu

  3. Jak používat export s Pythonem na Linuxu