Différences entre les versions de « Lancer un scan des adresse ip depuis Home Assistant »

De Wiki de Mémoire Vive
Aller à la navigation Aller à la recherche
 
Ligne 6 : Ligne 6 :


<pre>
<pre>
# Importez les modules nécessaires
import sys
import sys
import socket
import socket
from scapy.all import ARP, Ether, srp
from scapy.all import ARP, Ether, srp


# Définissez une fonction pour scanner les adresses IP
def scan_ips(start_ip, end_ip):
def scan_ips(start_ip, end_ip):
    # Générez une liste d'adresses IP dans la plage spécifiée
     ip_range = [f'192.168.0.{i}' for i in range(start_ip, end_ip + 1)]
     ip_range = [f'192.168.0.{i}' for i in range(start_ip, end_ip + 1)]
    # Créez un objet ARP avec les adresses IP de la plage
     arp = ARP(pdst=ip_range)
     arp = ARP(pdst=ip_range)
    # Créez un objet Ether avec une adresse de destination spéciale
     ether = Ether(dst="ff:ff:ff:ff:ff:ff")
     ether = Ether(dst="ff:ff:ff:ff:ff:ff")
    # Combinez les objets Ether et ARP pour créer un paquet
     packet = ether/arp
     packet = ether/arp


    # Envoyez le paquet et attendez les réponses pendant 3 secondes
     result = srp(packet, timeout=3, verbose=0)[0]
     result = srp(packet, timeout=3, verbose=0)[0]


    # Parcourez les paires de paquets envoyés et reçus
     for sent, received in result:
     for sent, received in result:
        # Affichez l'adresse IP source et tentez de résoudre le nom d'hôte
         print(f"IP: {received.psrc}, Nom d'hôte: {socket.getfqdn(received.psrc)}")
         print(f"IP: {received.psrc}, Nom d'hôte: {socket.getfqdn(received.psrc)}")


# Vérifiez si le script est exécuté en tant que programme principal
if __name__ == "__main__":
if __name__ == "__main__":
     # Vérifiez si des arguments ont été passés
     # Vérifiez si le nombre d'arguments est incorrect
     if len(sys.argv) != 3:
     if len(sys.argv) != 3:
        # Affichez un message d'utilisation
         print("Utilisation : python3 scan-ip.py <start_ip> <end_ip>")
         print("Utilisation : python3 scan-ip.py <start_ip> <end_ip>")
        # Terminez l'exécution du script avec un code de sortie non nul (1)
         sys.exit(1)
         sys.exit(1)


    # Récupérez les arguments de la ligne de commande
     start_ip = int(sys.argv[1])  # Premier argument : start_ip
     start_ip = int(sys.argv[1])  # Premier argument : start_ip
     end_ip = int(sys.argv[2])  # Deuxième argument : end_ip
     end_ip = int(sys.argv[2])  # Deuxième argument : end_ip


    # Appelez la fonction scan_ips avec les arguments spécifiés
     scan_ips(start_ip, end_ip)
     scan_ips(start_ip, end_ip)
</pre>
</pre>

Version actuelle datée du 26 septembre 2023 à 18:52

Il s'agit d'un exercice, qui consiste à définir un service dans Home Assistant pour scanner des adresses IP.

Une fois de plus, j'ai fait appel à ChatGPT, pour créer un script Python.

Voici ce qu'il m'a proposé, je l'ai stocké dans le dossier Scripts

# Importez les modules nécessaires
import sys
import socket
from scapy.all import ARP, Ether, srp

# Définissez une fonction pour scanner les adresses IP
def scan_ips(start_ip, end_ip):
    # Générez une liste d'adresses IP dans la plage spécifiée
    ip_range = [f'192.168.0.{i}' for i in range(start_ip, end_ip + 1)]

    # Créez un objet ARP avec les adresses IP de la plage
    arp = ARP(pdst=ip_range)

    # Créez un objet Ether avec une adresse de destination spéciale
    ether = Ether(dst="ff:ff:ff:ff:ff:ff")

    # Combinez les objets Ether et ARP pour créer un paquet
    packet = ether/arp

    # Envoyez le paquet et attendez les réponses pendant 3 secondes
    result = srp(packet, timeout=3, verbose=0)[0]

    # Parcourez les paires de paquets envoyés et reçus
    for sent, received in result:
        # Affichez l'adresse IP source et tentez de résoudre le nom d'hôte
        print(f"IP: {received.psrc}, Nom d'hôte: {socket.getfqdn(received.psrc)}")

# Vérifiez si le script est exécuté en tant que programme principal
if __name__ == "__main__":
    # Vérifiez si le nombre d'arguments est incorrect
    if len(sys.argv) != 3:
        # Affichez un message d'utilisation
        print("Utilisation : python3 scan-ip.py <start_ip> <end_ip>")
        # Terminez l'exécution du script avec un code de sortie non nul (1)
        sys.exit(1)

    # Récupérez les arguments de la ligne de commande
    start_ip = int(sys.argv[1])  # Premier argument : start_ip
    end_ip = int(sys.argv[2])  # Deuxième argument : end_ip

    # Appelez la fonction scan_ips avec les arguments spécifiés
    scan_ips(start_ip, end_ip)

On ajoute aussi la définition du service dans le fichier Configuration.yaml, comme ceci,

shell_command:
  scan_ip_shell: 'python3 /config/scripts/scan-ip.py {{ start_ip }} {{ end_ip }}'

Voilà ce que ça donne en sortie,

stdout: |-
  IP: 192.168.0.1, Nom d'hôte: 192.168.0.1
  IP: 192.168.0.2, Nom d'hôte: 192.168.0.2
  IP: 192.168.0.5, Nom d'hôte: 192.168.0.5
  IP: 192.168.0.10, Nom d'hôte: 192.168.0.10
stderr: ""
returncode: 0

Bref on peut assez facilement coder des trucs à insérer ensuite dans Home Assistant.

Denis