GNU/Linux >> Tutoriales Linux >  >> Linux

Aprenda a detectar equipos de red con Scientific Linux 7.1 y Python

A veces, es posible que tenga problemas de red o de cortafuegos internos que requieran un análisis de red para encontrar qué direcciones IP están en uso. Para ello, podemos utilizar herramientas ya preparadas como nmap, zmap o angryIP. Pero si no tenemos acceso a Internet para descargar estas herramientas, podemos hacer el escaneo usando solo comandos manuales. Sin embargo, el escaneo manual puede ser bastante tedioso, con el entendimiento de que debe hacerse para cada dirección IP dada en nuestra red.

Teniendo en cuenta lo anterior, mostraré en este tutorial cómo podemos automatizar esta tarea usando Python, sabiendo que Python está disponible en casi todas las distribuciones de Linux disponibles en el mercado.

Python es la opción perfecta para esto porque nos permite automatizar todas las tareas que puede ejecutar el sistema operativo, solo tenemos que usar las bibliotecas correctas.

Usando bibliotecas de Linux en Python

El enfoque de nuestro estudio actual es el comando de barrido ping, para detectar todos los equipos conectados y encendidos en nuestra red. El script que estamos construyendo hace un ping a cada dirección IP en la red. Por ejemplo, usamos la máscara de subred / 24, circulará solo a través de los primeros 3 octetos de la IP. Lo primero que tenemos que considerar para este script es qué bibliotecas del sistema se pueden usar para la tarea, tenemos que importar las bibliotecas sys y subprocess. Estas librerías permiten el uso de comandos específicos del intérprete de python y del propio sistema operativo, en este caso Scientific Linux 7.1.

import sys, subprocess

Guardaré mi secuencia de comandos con el nombre networkmonitor.py.

Detectar el argumento correcto

Cuando ejecutamos el script usando el comando

>>python networkmonitor.py 10.0.0.

en el shell, si el argumento del comando es incorrecto (si len(sys.argv)<>2:), la secuencia de comandos mostrará un ejemplo correcto. (imprime "networkmonitor.py 10.0.0").

El argumento es la dirección IP de la subred escaneada, solo se usan los primeros 3 octetos. Entonces, si el argumento es correcto, el resultado del comando "ping -c1 "+sys.argv[1] se almacenará en una variable, en nuestro caso es cmdping, sys.argv[1] es la variable "argumento". en el módulo sys y almacenará el primer argumento dado al script. En entornos UNIX tenemos que usar ping -c1 porque el comando ping se ejecutaría infinitamente.

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

Comando de subproceso, sus argumentos y el bucle for


En la siguiente línea comienza el bucle for, el cual se ejecuta hasta llegar al límite (condición de parada) que le hemos puesto, la condición es el rango de IP que queremos escanear. En este punto, es importante considerar el tiempo que necesita el script para escanear el rango, cuanto mayor sea el rango, más tiempo se ejecutará el script. El subproceso.Popen nos permite ejecutar un comando de shell y esperar hasta que finalice. Una vez completado, comprobamos el estado que devolvió el comando. El cmdping+str(x), ejecutado por el subproceso.Popen , aumenta el índice de la IP proporcionada por el argumento en cada ciclo del ciclo for.

Shell=true significa que el proceso se ejecutará en el shell. Sin embargo, el sitio web de documentos de Python advierte sobre el peligro de usar shell=true, así que tenga cuidado con el comando que ejecuta. El subprocess.PIPE usando como argumento stderr indica que Python abrirá una tubería a la secuencia estándar.

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

En este caso, solo probamos once direcciones IP (de 99 a 110).

Ahora tenemos que comprobar el contenido de stderr, nos detendremos (romperemos) cuando la variable esté vacía; de lo contrario, mostraremos la salida estándar  contenido.

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

Este último código debe ejecutarse si el shell permanece en estado verdadero.

El código completo ahora es:

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

El resultado de nuestro pequeño script es:



Como se muestra en la captura de pantalla, la herramienta solo hace un ping para obtener una respuesta positiva o negativa y luego pasa a la siguiente dirección IP, y así sucesivamente para analizar todo el rango de direcciones.

Cabe mencionar que no reclamo la autoría del código analizado anteriormente. Solo estoy explicando su funcionalidad paso a paso para comprender mejor los comandos del sistema y las funciones de red. Daré crédito al autor.


Linux
  1. Cómo establecer una dirección IP estática y configurar la red en Linux

  2. Cómo encontrar archivos con permisos SUID y SGID en Linux

  3. Álgebra vectorial en Scientific Linux 7.1 con Python Script:Parte 1

  4. Flatpak en Linux:qué es y cómo instalar aplicaciones con él

  5. Cómo administrar múltiples versiones de Python con Pyenv en Linux

Cómo monitorear el uso de la red con nload en Linux

Introducción a VPN y aquí está cómo usarlo en Linux

Cómo instalar y usar Python-Mistune en Linux

Cómo detectar y administrar dispositivos en Linux

Cómo instalar Anaconda Navigator y JupyterLab en Linux

Cómo instalar y configurar Linux Malware Detect (LMD) en Linux