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.
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.