Python : scan réseau

Bonjour
J’essaye d’écrire un script python mais je suis bloqué par une fonction
Je voudrais scanner le réseau local (c’est à dire une dizaine de poste avec des ip de style 192.168.0.[0|255] à la recherche de celle qui à un port spécifique d’ouvert
L’histoire du port ouvert, je pense gérer.
C’est le scan que je n’arrive pas à coder. J’ai vu la doc de python-nmap , de socket et d’ipdress mais je n’arrive pas à grand chose mis à part scanner ma machine.
De plus j’aimerais autant éviter d’utiliser une commande Linux passée par un subprocess.

Enfin voilà, je bloque malgré mes recherches sur le NEt, je me dis que je ne dois pas avoir les bons mots clefs car ce ne doit pas être si dur que ça.

Enfin, voilà, si qq un a des pistes je suis preneur

Merci,

Donc je serai un truc du style, scanReseau(ModeledIP) qui retournerait
192.168.1.12
192.168.1.32
192.168.1.55

Enfin l’ip des machines présentes…

(poru l’instant j’ai bien un truc avec une boucle de ce style

for i in range(len(all_hosts)):
    output = subprocess.call(['fping','-a', '-q', str(all_hosts[i])])

mais c’est hyper long…)
Et puis je préférerai sans appel de commande linux

Ouais enfin là de ce que je vois, c’est juste une autre manière de lancer des commandes linux:
python ne fait que la boucle et appelle le shell pour lancer fping à chaque itération.

Et du coup, je pense que ça explique pourquoi c’est long (au delà des délais d’attente réseau), parce qu’à mon avis, ta boucle lance un nouveau shell fils à chaque appel de fping, alors qu’en boucle dans un shell, toutes les commandes ping se lanceraient dans le même shell ou tu executes ta boucles.
(pas sur)

Il est possible que ce que tu fais nécessite une execution en sudo: certaines fonctionnalités de scan réseau nécessitent des droits root.
Si tu ne comprends pas pourquoi un truc local s’execute, mais pas quand tu essayes sur le réseau, c’est possible que ce soit ça.

Tant qu’à utiliser une commande Linux, autant utiliser nmap :

nmap -sP 192.168.1.0/24

Sinon en Python (recopié de la doc python-nmap adapté et testé) :

#!/usr/bin/env python
import nmap # import nmap.py module
nm = nmap.PortScanner() # instantiate nmap.PortScanner object

nm.scan(hosts='192.168.1.0/24', arguments='-n -sP')
for host in nm.all_hosts():
    print('----------------------------------------------------')
    print('Host : %s (%s)' % (host, nm[host].hostname()))
    print('State : %s' % nm[host].state())

1 J'aime

@mattotop

python ne fait que la boucle et appelle le shell pour lancer fping à chaque itération.

Effectivement, j’aurais dû y penser…

@Bruno1
Nickel. J’avais mis de côté nmap car son import plantait sous Pycharm (mais fonctionnait dans un python3 ) et j’ai enfin compris pourquoi : je n’avais pas bien appréhendé la notion d’environnement virtuel et donc l’environnement de Pycharm n’appelait pas le même python que la console

Merci beaucoup, ça m’ôte une épine du pied et cela aura été instructif

Bien à vous :wink: