GNU/Linux >> Tutoriels Linux >  >> Linux

Apprenez à détecter les équipements réseau avec Scientific Linux 7.1 et Python

Parfois, vous pouvez avoir des problèmes de réseau ou de pare-feu dans un interne qui nécessitent une analyse du réseau pour trouver les adresses IP utilisées. Pour cela, nous pouvons utiliser des outils prêts à l'emploi tels que nmap, zmap ouangryIP. Mais si nous n'avons pas accès à Internet pour télécharger ces outils, nous pouvons effectuer l'analyse en utilisant uniquement des commandes manuelles. Cependant, l'analyse manuelle peut être assez fastidieuse, avec la compréhension qui doit être faite pour chaque adresse IP donnée sur notre réseau.

En tenant compte de ce qui précède, je vais montrer dans ce tutoriel comment nous pouvons automatiser cette tâche en utilisant Python, sachant que Python est disponible sur presque toutes les distributions Linux disponibles sur le marché.

Python est le choix parfait pour cela car il nous permet d'automatiser toutes les tâches que le système d'exploitation peut exécuter, il nous suffit d'utiliser les bonnes bibliothèques.

Utilisation des bibliothèques Linux en Python

Notre étude actuelle se concentre sur la commande de balayage ping, pour détecter tous les équipements connectés et allumés sur notre réseau. Le script que nous construisons envoie un ping à chaque adresse IP du réseau. Par exemple, nous utilisons le masque de sous-réseau / 24, il ne bouclera que sur les 3 premiers octets de l'IP. La première chose que nous devons considérer pour ce script est quelles bibliothèques système peuvent être utilisées pour la tâche, nous devons importer les bibliothèques sys et subprocess. Ces bibliothèques permettent l'utilisation de commandes spécifiques de l'interpréteur python et du système d'exploitation lui-même, dans ce cas Scientific Linux 7.1.

import sys, subprocess

Je vais enregistrer mon script sous le nom networkmonitor.py.

Détecter le bon argument

Lorsque nous exécutons le script en utilisant la commande

>>python networkmonitor.py 10.0.0.

sur le shell, si l'argument de la commande est incorrect (if len(sys.argv)<>2:), le script affichera un exemple correct. (imprimer "networkmonitor.py 10.0.0.").

L'argument est l'adresse IP du sous-réseau scanné, seuls les 3 premiers octets sont utilisés. Donc, si l'argument est correct, alors le résultat de la commande "ping -c1 "+sys.argv[1] sera stocké dans une variable, dans notre cas c'est cmdping, sys.argv[1] est la variable "argument" dans le module sys et stockera le premier argument donné au script. Dans les environnements UNIX, nous devons utiliser ping -c1 car la commande ping s'exécuterait à l'infini.

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

Commande de sous-processus, ses arguments et la boucle for


Sur la ligne suivante commence la boucle for, qui est exécutée jusqu'à ce qu'elle atteigne la limite (condition d'arrêt) que nous lui avons définie, la condition est la plage IP que nous voulons analyser. À ce stade, il est important de prendre en compte le temps dont le script a besoin pour analyser la plage, plus la plage est grande, plus le script s'exécutera longtemps. Le sous-processus.Popen nous permet de lancer une commande shell et d'attendre qu'elle se termine. Une fois terminé, nous vérifions l'état renvoyé par la commande. Le cmdping+str(x), exécuté par le sous-processus.Popen , augmente l'indice de l'adresse IP donnée par l'argument à chaque cycle de la boucle for.

Le shell=true signifie que le processus sera exécuté sur le shell. Cependant, le site Web de documents Python met en garde contre le danger d'utiliser shell=true, alors faites attention à la commande que vous exécutez. L'argument subprocess.PIPE using as stderr indique que Python doit ouvrir un canal vers le flux standard.

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

Dans ce cas, nous n'avons testé que onze adresses IP (de 99 à 110).

Maintenant, nous devons vérifier le contenu de stderr, nous nous arrêterons (casser) lorsque la variable sera vide, sinon nous afficherons la stdout  contenu.

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

Ce dernier code doit s'exécuter si le shell reste à l'état vrai.

Le code complet est maintenant :

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

Le résultat de notre petit script est :



Comme le montre la capture d'écran, l'outil effectue uniquement un ping pour obtenir une réponse positive ou négative, puis passe à l'adresse IP suivante, et ainsi de suite pour analyser toute la plage d'adresses.

Il convient de mentionner que je ne revendique pas la paternité du code analysé ci-dessus. J'explique simplement sa fonctionnalité étape par étape pour mieux comprendre les commandes système et les fonctions réseau. Je donnerai crédit à l'auteur.


Linux
  1. Comment définir une adresse IP statique et configurer le réseau sous Linux

  2. Algèbre vectorielle sur Scientific Linux 7.1 avec Python Script :Partie 1

  3. Flatpak sur Linux :qu'est-ce que c'est et comment installer des applications avec ?

  4. Comment gérer plusieurs versions de Python avec Pyenv sous Linux

  5. Comment utiliser l'exportation avec Python sous Linux

Comment surveiller l'utilisation du réseau avec nload sous Linux

Introduction au VPN et voici comment l'utiliser sous Linux

Comment installer et utiliser Python-Mistune sous Linux

Comment détecter et gérer les appareils sous Linux

Comment installer Anaconda Navigator et JupyterLab sous Linux

Comment installer et configurer Linux Malware Detect (LMD) sur Linux