GNU/Linux >> Linux Esercitazione >  >> Linux

Scopri come rilevare le apparecchiature di rete con Scientific Linux 7.1 e Python

A volte potresti avere problemi di rete o firewall in un interno che richiede una scansione della rete per trovare quali indirizzi IP sono in uso. A tale scopo, possiamo utilizzare strumenti già pronti come nmap, zmap o angryIP. Ma se non abbiamo accesso a Internet per scaricare questi strumenti, possiamo eseguire la scansione utilizzando solo i comandi manuali. Tuttavia, la scansione manuale può essere piuttosto noiosa, con la consapevolezza che dovrebbe essere eseguita per ogni indirizzo IP fornito sulla nostra rete.

Tenendo conto di quanto sopra, mostrerò in questo tutorial come possiamo automatizzare questa attività utilizzando Python, sapendo che Python è disponibile su quasi tutte le distribuzioni Linux disponibili sul mercato.

Python è la scelta perfetta per questo perché ci consente di automatizzare ogni attività che il sistema operativo può eseguire, dobbiamo solo usare le librerie corrette.

Utilizzo delle librerie Linux in Python

L'obiettivo del nostro studio attuale è il comando ping sweep, per rilevare tutte le apparecchiature connesse e accese sulla nostra rete. Lo script che stiamo costruendo esegue un ping su ogni indirizzo IP sulla rete. Ad esempio usiamo la subnet mask / 24, che scorrerà solo attraverso i primi 3 ottetti dell'IP. La prima cosa che dobbiamo considerare per questo script è quali librerie di sistema possono essere utilizzate per l'attività, dobbiamo importare le librerie sys e subprocess. Queste librerie consentono l'utilizzo di comandi specifici dell'interprete python e del sistema operativo stesso, in questo caso Scientific Linux 7.1.

import sys, subprocess

Salverò il mio script con il nome networkmonitor.py.

Rilevamento dell'argomento giusto

Quando eseguiamo lo script utilizzando il comando

>>python networkmonitor.py 10.0.0.

sulla shell, se l'argomento del comando è errato (se len(sys.argv)<>2:), lo script visualizzerà un esempio corretto. (stampa "networkmonitor.py 10.0.0.").

L'argomento è l'indirizzo IP della sottorete scansionata, vengono utilizzati solo i primi 3 ottetti. Quindi, se l'argomento è corretto, il risultato del comando "ping -c1 "+sys.argv[1] verrà archiviato in una variabile, nel nostro caso è cmdping, sys.argv[1] è la variabile "argomento" nel modulo sys e memorizzerà il primo argomento fornito allo script. Negli ambienti UNIX dobbiamo usare ping -c1 perché il comando ping verrebbe eseguito all'infinito.

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

Comando di sottoprocesso, i suoi argomenti e il ciclo for


Nella riga successiva inizia il ciclo for, che viene eseguito fino a raggiungere il limite (condizione di arresto) che abbiamo impostato per esso, la condizione è l'intervallo IP che vogliamo scansionare. A questo punto, è importante considerare il tempo necessario allo script per eseguire la scansione dell'intervallo, maggiore è l'intervallo, maggiore sarà l'esecuzione dello script. Il sottoprocesso.Popen ci consente di avviare un comando di shell e attendere fino al termine. Una volta completato, controlliamo lo stato restituito dal comando. Il cmdping+str(x), eseguito dal sottoprocesso.Popen , aumenta l'indice per l'IP dato dall'argomento su ogni ciclo del ciclo for.

La shell=true significa che il processo verrà eseguito sulla shell. Tuttavia, il sito Web di documenti Python avverte del rischio di utilizzare shell=true, quindi fai attenzione a quale comando esegui. L'argomento subprocess.PIPE che utilizza come stderr indica che Python aprirà una pipe al flusso standard.

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

In questo caso, abbiamo testato solo undici indirizzi IP (da 99 a 110).

Ora dobbiamo controllare il contenuto di stderr, ci fermeremo (break) quando la variabile è vuota, altrimenti mostriamo lo stdout  contenuto.

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

Quest'ultimo codice deve essere eseguito se la shell rimane in stato true.

Il codice completo è ora:

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

L'output del nostro piccolo script è:



Come mostrato nello screenshot, lo strumento esegue un ping solo per ottenere una risposta positiva o negativa, quindi passa all'indirizzo IP successivo e così via per analizzare l'intero intervallo di indirizzi.

Va menzionato che non rivendico la paternità del codice sopra analizzato. Sto solo spiegando la sua funzionalità passo dopo passo per ottenere una migliore comprensione dei comandi di sistema e delle funzioni di rete. Darò credito all'autore.


Linux
  1. Come trovare file con autorizzazioni SUID e SGID in Linux

  2. Algebra vettoriale su Scientific Linux 7.1 con script Python:parte 1

  3. Come monitorare l'utilizzo della rete con nload in Linux?

  4. Scopri come comprimere e decomprimere file in Linux ed essere uno Zip Master

  5. Come utilizzare l'esportazione con Python su Linux

Come monitorare l'utilizzo della rete con nload in Linux

Introduzione alla VPN ed ecco come usarla in Linux

Come installare e utilizzare Python-Mistune su Linux

Come rilevare e gestire i dispositivi su Linux

Come installare Anaconda Navigator e JupyterLab su Linux

Come installare e configurare Linux Malware Detect (LMD) su Linux