Note au lecteur : La réponse originale a été postée il y a longtemps et à l'époque où j'apprenais seulement à écrire des scripts shell. Voir la version révisée ci-dessous pour un nouveau script amélioré qui s'exécute beaucoup plus rapidement.
Réponse originale
nmap
serait mon choix n ° 1, mais que faire si vous ne l'avez pas? Le bricolage consisterait en un script ping qui passe manuellement chaque adresse IP possible sur le réseau. Ce que nous avons ici est juste une boucle while, où nous définissons le dernier chiffre de l'adresse, faisons un ping unique silencieux à l'adresse, vérifions si la commande aboutit ou non (et si elle réussit, l'hôte est évidemment actif) et la printf
déclaration. Rapide et sale, il m’a pris environ 10 minutes pour l’écrire, mais l’exécution peut être un peu lente, cependant.
#!/bin/sh
# set -x
NUM=1
while [ $NUM -lt 256 ];do
ping -q -c 1 192.168.0.$NUM > /dev/null
RESULT=$(echo $?)
if [ $RESULT -eq 0 ]; then
printf 192.168.0.$NUM"\n"
fi
NUM=$(expr $NUM + 1)
done
Réponse revisitée
À l'origine, j'avais posté cette réponse en août 2015. Depuis, j'en ai appris un peu plus sur les scripts shell, et une fois que j'ai vu ce script, j'ai pensé que ce serait une bonne idée de revoir cette réponse pour y apporter quelques améliorations. Voici quelques idées:
Le script est évidemment lent et ping
attend la réponse de l'hôte. Par défaut, ping
pour deux RTT, cela peut varier en fonction de la densité de votre réseau et, autant que je sache, le protocole TCP double le temps d'attente à chaque fois (du moins en fonction de cela ). Donc, nous pourrions forcer ping
le temps mort avec le -w 1
drapeau. Étant donné que nous avons 256 adresses et que nous supposons 1 seconde pour chaque adresse, le script prendra environ 256/60 = 4,27 minutes.
Faire une commande puis capturer son statut de sortie avec $?
n'était pas vraiment nécessaire. Le if ... then;...fi
peut opérer directement sur les commandes. En d'autres termes, il suffit de faire ceci:
if ping -w 1 -q -c 1 192.168.0.$NUM > /dev/null ;
then
<some other code here>
fi
La printf
commande peut être réécrite de la manière suivante:
printf "IP %s is up\n" 192.168.0."$NUM"
Il s’agit plutôt d’un changement stylistique, mais cohérent avec le printf
fonctionnement et l’apparence de beaucoup de langues, avec la citation de "$NUM"
variable. Il n'est pas nécessaire de citer ici - comme nous ne traitons que de chiffres, nous n'avons pas besoin d'anticiper le fractionnement des mots car il y a des espaces dans une variable.
Il est possible d’améliorer considérablement les performances en générant plusieurs processus en arrière-plan. Le script ci-dessous fait exactement cela. Je mets le ping
et printf
dans une fonction pingf
(oui, nom ringard, je sais). Maintenant, il y a aussi une seule main
fonction qui fait la boucle et l'appel de pingf
.
#!/bin/sh
# Uncomment for debugging
#set -x
pingf(){
if ping -w 2 -q -c 1 192.168.0."$1" > /dev/null ;
then
printf "IP %s is up\n" 192.168.0."$1"
fi
}
main(){
NUM=1
while [ $NUM -lt 255 ];do
pingf "$NUM" &
NUM=$(expr "$NUM" + 1)
done
wait
}
main
A quel point ça marche mieux? Pas mal, en fait, prend quelques secondes.
$ time ./ping_script.sh
IP 192.168.0.1 is up
IP 192.168.0.101 is up
IP 192.168.0.27 is up
IP 192.168.0.29 is up
0m02.50s real 0m00.01s user 0m00.12s system
Choses à garder à l'esprit
- Windows (à partir de Windows 7, je pense) ont commencé à bloquer la réponse aux demandes d'écho ICMP. Ask Ubuntu et d'autres sites du même genre suscitent de nombreuses questions à ce sujet. "Hé, mon ordinateur Linux peut être traité, mais pas sous Windows, qu'est-ce qui se passe avec ça?" Sachez simplement que pour les versions Windows plus récentes, vous devez activer la réponse à l'écho ICMP.
angry ip scanner