Note au lecteur : La réponse originale a été postée il y a un certain temps et à l'époque où je n'apprenais que le script Shell. Voir la version revisitée ci-dessous pour un nouveau et amélioré Shell qui s'exécute beaucoup plus rapidement.
Réponse originale
nmap
serait mon premier choix, mais que faire si vous ne l'avez pas ? La méthode DIY serait avec un ping script qui passe par chaque adresse IP possible sur le réseau manuellement. Ce que nous avons ici est juste une boucle while, où nous définissons le dernier chiffre de l'adresse, faisons un ping silencieux à l'adresse, vérifions si la commande a réussi ou non (et si elle a réussi, alors l'hôte est manifestement en place), et printf
déclaration. C'est une méthode simple et rapide, qui 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 révisée
J'ai initialement publié cette réponse en août 2015. Depuis, j'ai appris un peu plus sur le Shell script, et j'ai une fois que j'ai vu ce Shell, j'ai pensé que ce serait une bonne idée de revisiter cette réponse pour ajouter 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, ce qui peut varier en fonction de l'encombrement de votre réseau, et pour autant que je sache, le protocole TCP double le temps d'attente à chaque fois (du moins d'après l'étude de la Commission européenne). este ). On pourrait donc forcer ping
pour sortir avec -w 1
drapeau. Comme nous avons 256 adresses et que nous supposons 1 seconde pour chaque adresse, le script prendra environ 256/60 = 4,27 minutes.
-
Exécuter une commande puis capturer son état de sortie avec $?
n'était pas vraiment nécessaire. Le site if ... then;...fi
peut agir directement sur les commandes. En d'autres termes, il suffit de le faire :
if ping -w 1 -q -c 1 192.168.0.$NUM > /dev/null ;
then
<some other code here>
fi
-
El printf
peut être réécrite comme suit :
printf "IP %s is up\n" 192.168.0."$NUM"
Il s'agit plus d'un changement de style, mais il est cohérent avec la façon dont printf
fonctionne et se présente comme dans beaucoup d'autres langues, avec des guillemets. "$NUM"
variable. La citation n'est pas nécessaire ici - puisque nous ne traitons que des nombres, nous n'avons pas besoin d'anticiper le fractionnement des mots en raison de la présence d'espaces dans une variable.
-
Une amélioration des performances bien plus importante peut être obtenue si nous créons plusieurs processus en arrière-plan. Le script modifié ci-dessous fait exactement cela. J'ai mis le ping
et printf
en une fonction, pingf
(oui, nom ringard, je sais). Maintenant, il y a aussi un seul main
qui effectue le bouclage 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 cela fonctionne-t-il mieux ? Pas mal, en fait, ça ne prend que 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
Les choses à garder à l'esprit
- Windows (depuis Windows 7, je crois) a commencé à bloquer les réponses aux demandes d'écho ICMP. Il y a pas mal de questions à ce sujet sur Ask Ubuntu et d'autres sites du genre "Hey, mon ordinateur Linux peut être pingué, mais pas ceux de Windows, qu'est-ce qui se passe ?". Soyez juste conscient du fait que pour les nouvelles versions de Windows, vous devez activer la réponse à l'écho ICMP.