Effectuer un scan réseau rapide et parallélisé en IPv4

Simple script pour le shell standard de FreeBSD.
On lui entre autant de réseaux qu'on veut, et il lance parallèlement arp-scan pour chaque réseau entré.


Le script complet

#!/bin/sh

clear

echo '--------------------------------------------------------------'
echo 'Ce script permet de scanner plusieurs réseaux en même temps.'
echo 'Il utilise arp-scan pour effectuer les requêtes arp.'
echo 'Les résultats s'\''affichent au fur et à mesure.'
printf '\n'

read -p 'Entrer les réseaux à scanner (ex : 192.168.0.0/16 172.16.18.0/24) : ' networks

# Définir les réseaux à scanner en fixe autrement :
# networks='192.168.0.0/16 172.16.0.0/12'

clear

# Vérifier si les applications sont bien installées :
pkg info -e arp-scan >/dev/null 2>&1 || pkg install -y arp-scan
pkg info -e nbtscan >/dev/null 2>&1 || pkg install -y nbtscan

clear

# Fonction pour scanner IPv4 avec arp-scan et résoudre les noms d'hôtes
scan_and_resolve() {
    network='$1'
    mask='$2'
    safe_network=$(echo '$network' | tr '.' '_')
    
    echo 'Scan IPv4 du réseau $network/$mask en cours ...'
    
    # Créer un fichier temporaire pour les résultats
    tmp_file=$(mktemp)
    
    # Ajustement des paramètres de retry et timeout pour accélérer le scan
    sudo arp-scan --retry=3 --timeout=1000 '$network/$mask' | grep -vE 'Interface|Starting|Ending|packets|^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/[0-9]+$' | while read -r line; do
        if [ -n '$line' ]; then
            ip=$(echo '$line' | awk '{print $1}')
            mac=$(echo '$line' | awk '{print $2}')
            
            # Résoudre le nom d'hôte
            hostname=$(host '$ip' 2>/dev/null | awk '{print $5}' | sed 's/\.$//')
            
            if [ -z '$hostname' ] || [ '$hostname' = '3(NXDOMAIN)' ]; then
                nbtsname=$(sudo nbtscan -q -s : '$ip' 2>/dev/null | cut -d: -f2)
                if [ -n '$nbtsname' ]; then
                    hostname='$nbtsname'
                else
                    hostname='N/A'
                fi
            fi
            
            echo '$ip ($mac) - $hostname' >> '$tmp_file'
        fi
    done
    
    # Afficher les résultats
    echo ''
    echo 'Résultats pour le réseau $network/$mask :'
    echo '--------------------------------------'
    
    if [ -s '$tmp_file' ]; then
        cat '$tmp_file'
        count=$(wc -l < '$tmp_file')
        echo ''
        echo 'Nombre d'\''hôtes trouvés : $count'
    else
        echo 'Aucun hôte trouvé.'
    fi
    
    echo ''
    
    # Nettoyer le fichier temporaire
    rm -f '$tmp_file'
}

# Lancer les scans en parallèle
for network in $networks; do
    net=$(echo '$network' | cut -d'/' -f1)
    mask=$(echo '$network' | cut -d'/' -f2)
    scan_and_resolve '$net' '$mask' &
done

# Attendre que tous les scans soient terminés
wait

echo 'Tous les scans sont terminés.'

⬆️ Retour en haut de la page