Scanner de rede em Python

Publicado por ROBISON PEREIRA MACHADO (última atualização em 28/05/2012)

[ Hits: 17.857 ]

Homepage: http://robisonpm.blogspot.com/

Download networkscanner.py3




Este script mostra quantos equipamentos estão online na rede, seus IPs e MACs e por fim, o número total.

Primeiro forneça um IP completo, exemplo: 192.168.0.1

Depois forneça o último octeto a ser escaneado, exemplo: 254

Ele usa threads e em meus testes demora cerca de 6 segundos para escanear minha rede, sendo que mando ele escanear do IP 1 ao 254.

  



Esconder código-fonte

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
__doc__="""
# SCANNER DE REDE PYTHON 3 - POR ROBISON PEREIRA MACHADO
#
# FORNEÇA O PRIMEIRO IP COMPLETO (EX: 192.168.0.1)
# DEPOIS FORNEÇA O IP FINAL, APENAS O ÚLTIMO OCTETO (EX: 254)
#
# SE FORNECERMOS O IP 192.168.0.1 E DEPOIS O VALOR 254
# eLE IRÁ ESCANEAR DO IP FINAL 1 ATÉ O 254
# NO FINAL MOSTRARÁ OS IP's E OS MAC's QUE ESTÃO CONECTADOS
# E DIRÁ O NÚMERO DE EQUIPAMENTOS ONLINE NA REDE
"""
import sys
import subprocess
import os
import subprocess
import time
import threading
from threading import Thread


class NetworkScanner(object):
   ips_online=[]
   threads=[]
   
   def scannear_rede(self, ip_inicial, ip_final):
      ip_base=subprocess.getoutput("echo %s 2> /dev/null | egrep -o \"([0-9]{1,3}\.){3}\"" % ip_inicial)
      ip_inicial=int(subprocess.getoutput("echo %s 2> /dev/null | egrep -o \"([0-9]{1,3})$\"" % ip_inicial))
      ip_final=int(ip_final)
   
      while(ip_inicial <= ip_final):
         ip=ip_base+str(ip_inicial)
         self.threads.append(threading.Thread(target=self.ping, args=(ip,)).start())
         ip_inicial += 1
   
   def ping(self, ip):
      time.sleep(0.2)
      ping = os.system('ping -c 1 %s > /dev/null 2> /dev/null' % ip)
      if(ping==0):
         mac_adress=subprocess.getoutput("arp -a %s 2> /dev/null | egrep -o \"([a-Z,0-9]{2}\:){5}[a-Z,0-9]{2}\"" % ip)
         self.ips_online.append((ip,mac_adress,))
      while(len(self.threads)==0):
         time.sleep(0.5)
      self.threads.pop()
      print("\n\n*****************\nTHREADS EXISTENTES >> %s\n*****************\n" % len(self.threads))
      return 
      
def main():
   ip_inicial = input("Digite o IP inicial (completo): ")
   ip_final = input("Digite o IP final (apenas o último octeto. Ex: 254): ")
   
   
   scan = NetworkScanner()
   scan.scannear_rede(ip_inicial, ip_final)
   
   while(len(scan.threads)>0):
      time.sleep(0.5)
      #print("\n\n*****************\nTHREADS EXISTENTES >> %s\n*****************\n" % len(scan.threads))
   
   scan.ips_online.sort()
   for pc in scan.ips_online:
      print("PC ONLINE >> IP=%s - MAC=%s" % (pc[0], pc[1]))
   
   print("\nExistem %s dispositivos online neste momento\n\n" % len(scan.ips_online))
   
   return 0

if __name__ == '__main__':
   main()



Scripts recomendados

Verifica conexão - Ping

Pequeno scanner de rede local

Validação de IP

Rixy port scanner

Sockets em Python


  

Comentários
[1] Comentário enviado por nettux em 28/05/2012 - 13:13h

como bota ele pra fungar? instalo o python e depois?

[2] Comentário enviado por berlotto em 29/05/2012 - 08:29h

@netto_info instala o Python3

dá permissão de execução ao script
$ chmod a+x networkscanner.py3

depois executa-o:
$ ./networkscanner.py3

[3] Comentário enviado por robisonmachado em 29/05/2012 - 21:07h

Obrigado berlotto pelas explicações ao colega netto_info, eu acabei esquecendo de informar os passos pormenorizados, bem então vamos a eles:
1) Instale o python3
2) Dê permissão de execução: chmod a+x networkscanner.py3
3) execute o script com ./networkscanner.py3
(ponto, barra, nome do script)

Devo implementar um interface gráfica para ele e um pacote .deb e .rpm
Obrigado por usarem, qualquer bug relatem-me.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts