Je cherche a scanner mon réseau local (donc a savoir quels ip comprisent entre 192.168.1.0 & 192.168.1.255 sont utilisé)
Sur le web, on trouve surtout une sorte de "quels appareils se disent dans le réseau" et non pas "quels appareils SONT sur le réseau"
J'ai ce code ci, fais maison, mais assez "lent", et surtout, se base sur un donnée peu fiable, le ping (vus que je peux désactivé mes réponses aux pings)
#!/bin/bash
ips="$(timeout 5 fping -g -a -q 192.168.1.0/24)"
tab=( ${ips// / } )
for ip in ${tab[@]}
do
echo $ip
done
Comment puis-je, en bash bien sur, scanner efficacement, et rapidement, mon réseau local ?
Merci !
CodeWe is an open-source live code-sharing website.
#!/bin/bash
#Boucle infini
while true :
do
#Recherche des ips
ips="$(timeout 15 fping -g -a -q 192.168.1.0 192.168.1.255)"
#Mise en tableau des ips
tab=( ${ips// / } )
#clear de l'écran
clear
#Affichage des ips
for ip in ${tab[@]}
do
echo $ip
done
done
En faite, le reste sert a afficher tout d'un seul coup, et non "petit à petit".
CodeWe is an open-source live code-sharing website.
# ping de tout le réseau nmap -sP 192.168.1.0/24
# scan des ports TCP (-sS) et UDP (-sU) d'une machine nmap -sS -sU 192.168.1.10 # scan rapide d'une machine (uniquement les ports les plus courants) nmap -F 192.168.1.10 # encore plus rapide en désactivant la résolution de nom (-n) nmap -F -n 192.168.1.10 # scan des ports précisés sur les cinq machines precisées nmap -p 0-80,443 192.168.1.10-5 # detection de l'OS nmap -O --osscan-guess 192.168.1.10
#mise en tableau des ips -> ne sert à rien, et le remplacement de paramètres (${ips// / })non plus. #clear l'écran -> pas indispensable #affichage des ips d'un seul coup -> en fait, non. les ips sont affichées l'une après l'autre
ips="$(timeout 15 fping -gaq 192.168.1.0 192.168.1.255)"
echo "$ips" # <- là, on affiche tout d'un seul coup : Use More Quotes !
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
#mise en tableau des ips -> ne sert à rien, et le remplacement de paramètres (${ips// / })non plus.
Sans, cela ne marche pas
dantonq a écrit:
#clear l'écran -> pas indispensable
Je trouve cela plus beau
dantonq a écrit:
#affichage des ips d'un seul coup -> en fait, non. les ips sont affichées l'une après l'autre
ips="$(timeout 15 fping -gaq 192.168.1.0 192.168.1.255)"
echo "$ips" # <- là, on affiche tout d'un seul coup : Use More Quotes !
Ce que je veux dire par la, c'est qu'on les cherches, puis les affiches. certe, vus la boucle elle on un micro décalage, mais bon, entre avec 5 secondes, et avoir 0.1 ms, mon choix est fait.
CodeWe is an open-source live code-sharing website.
En effet, il affiche les ips qui sont récolté. Seulement, mon objectif est de déboucher su un programme plus complexe, dont voici le début (je n'ai pas fini avec la marque, surtout sur les parentheses)
#!/bin/bash
function secondtotime() {
local sec="$1"
local h=$(($sec/3600)) m=$((($sec%3600)/60)) s=$(($sec%60))
printf "%2dh %02dm %02ds\n" $h $m $s
}
declare -a lg
declare -a macaddr
declare -a mark
while true :
do
#Recherche des ips
ips="$(timeout 15 fping -g -a -q 192.168.1.0 192.168.1.255)"
#Mise en tableau des ips
tab=( ${ips// / } )
for ip in ${tab[@]}
do
cutip="$(echo "$ip" | cut -d"." -f4)"
macaddr["$cutip"]="$(nmap -sP -PE $ip | grep "MAC Address: " | cut -d" " -f3)"
done
for ip in ${tab[@]}
do
cutip="$(echo "$ip" | cut -d"." -f4)"
mark["$cutip"]="$(nmap -sP -PE $ip | grep "MAC Address: " | cut -d" " -f4)"
done
for ip in ${tab[@]}
do
ip="$(echo "$ip" | cut -d"." -f4)"
lg[$ip]="$ip.$(date +%s)"
done
clear
for val in ${lg[@]}
do
ip="192.168.1.$(echo $val | cut -d'.' -f1)"
tt="$(echo $val | cut -d'.' -f2)"
dec=$(($(date +%s)-$tt))
mac=${macaddr[$(echo $val | cut -d'.' -f1)]}
if [ -z "$mac" ]
then
mac="??:??:??:??:??:??"
fi
marque=${mark[$(echo $val | cut -d'.' -f1)]}
if [ -z "$marque" ]
then
marque="??????"
fi
if [ "$dec" -lt "5" ]
then
echo " - $ip (connecté) (MAC: $mac) (Marque: $marque)"
else
echo " - $ip (connecté il y a$(secondtotime $dec)) (MAC: $mac) (Marque: $marque)"
fi
done
done
oh, la, la ! tu m'étonnes que c'est long, il y a beaucoup trop de boucles. les trois premières traitent le même tableau (dont les deux première scannent à chaque fois le réseau (oui, pas tout à fait; j'abuse )), et la dernière traite encore des informations de chaque ip...
comme il t'a été indiqué, tu ferais mieux de parser directement la sortie de nmap.
et puis il y a trop de commandes externes, dont le remplacement par des fonctionnalités de bash accélérerait notablement le script.
- Edité par dantonq 21 septembre 2017 à 0:15:26
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
Désoler de mon absence, j'avais du boulot ! Mais me revoila.
Pour les boucles, j'ai modifié en ceci :
for ip in ${tab[@]}
do
cutip="$(echo "$ip" | cut -d"." -f4)"
nmapres="$(nmap -sP -PE $ip | grep "MAC Address: ")"
macaddr["$cutip"]="$(echo $nmapres | cut -d" " -f3)"
mark["$cutip"]="$(echo "$(echo $nmapres | cut -d" " -f4)" | sed "s/(\ *//g" | sed "s/)\ *//g")"
done
for ip in ${tab[@]}
do
ip="$(echo "$ip" | cut -d"." -f4)"
lg[$ip]="$ip.$(date +%s)"
done
Pourquoi ne pas en faire qu'une seul ? Car la seconde défini la derniere connection, et qu'elle doit donc etre la plus proche possible du moment de l'affichage, sans quoi, le temps d'execution crée une différence de quelques seconde. Chez moi, il n'y a "que" 10 appareils de connecté, mais on peut parfois atteindre les 20-30, donc sa pourrait devenir génant.
J'ai ajouter ce petit bout de code :
while true :
#Recherche des ips (15 secs)
ptime="$(date +%s)"
.........
echo -e "$RED Temps d'execution: $(($(date +%s)-$ptime)) secondes $NC"
Qui a pour but de me dire combien de temps a pris les "recherches" sur les ips (MAC, Marque, ...)
La valeur tourne entre 2 et 5 secondes.
J'ai regardé pour nmap, seulement, certains PC ne sont pas inclus dans la liste (2 appareils manques), ce qui n'est pas terrible
Pour ce qui est du ARP, je n'ai pas trouvé sur le web, ou dans l'aide de fping ou autre, un moyen de définir le type de paquets envoyé.
Le code complet acctuel donne :
#!/bin/bash
function secondtotime() {
local sec="$1"
local h=$(($sec/3600)) m=$((($sec%3600)/60)) s=$(($sec%60))
printf "%2dh %02dm %02ds\n" $h $m $s
}
function secondtoprint() {
local h=$(($sec/3600)) m=$((($sec%3600)/60)) s=$(($sec%60))
printf "%2d" $h $m $s
}
declare -a lg
declare -a macaddr
declare -a mark
GREEN='\033[0;32m'
ORANGE='\033[0;33m'
RED='\033[0;31m'
NC='\033[0m'
tput reset
while true :
do
#Recherche des ips
ips="$(timeout 15 fping -g -a -q 192.168.1.0 192.168.1.255)"
ptime="$(date +%s)"
#Mise en tableau des ips
tab=( ${ips// / } )
for ip in ${tab[@]}
do
cutip="$(echo "$ip" | cut -d"." -f4)"
nmapres="$(nmap -sP -PE $ip | grep "MAC Address: ")"
macaddr["$cutip"]="$(echo $nmapres | cut -d" " -f3)"
mark["$cutip"]="$(echo "$(echo $nmapres | cut -d" " -f4)" | sed "s/(\ *//g" | sed "s/)\ *//g")"
done
for ip in ${tab[@]}
do
ip="$(echo "$ip" | cut -d"." -f4)"
lg[$ip]="$ip.$(date +%s)"
tput reset
for val in ${lg[@]}
do
ip="192.168.1.$(echo $val | cut -d'.' -f1)"
tt="$(echo $val | cut -d'.' -f2)"
dec=$(($(date +%s)-$tt))
mac=${macaddr[$(echo $val | cut -d'.' -f1)]}
if [ -z "$mac" ]
then
mac="??:??:??:??:??:??"
fi
marque=${mark[$(echo $val | cut -d'.' -f1)]}
if [ -z "$marque" ] || [ "$marque" == "Unknown" ]
then
marque="??????"
fi
if [ "$dec" -lt "5" ]
then
echo -e "$GREEN - $ip (connecté) (MAC: $mac) (Marque: $marque)$NC"
echo " - $ip (connecté) (MAC: $mac) (Marque: $marque)" >> /home/brieuc/Perso/logs/ScanLogs/$(date +'%Y-%m-%d::%H-%M-%S')
elif [ "$dec" -lt "60" ]
then
echo -e "$ORANGE - $ip (connecté il y a$(secondtotime $dec)) (MAC: $mac) (Marque: $marque)$NC"
echo " - $ip (connecté il y a$(secondtotime $dec)) (MAC: $mac) (Marque: $marque)" >> /home/brieuc/Perso/logs/ScanLogs/$(date +'%Y-%m-%d::%H-%M-%S')
else
echo -e "$RED - $ip (connecté il y a$(secondtotime $dec)) (MAC: $mac) (Marque: $marque)$NC"
echo " - $ip (connecté il y a$(secondtotime $dec)) (MAC: $mac) (Marque: $marque)" >> /home/brieuc/Perso/logs/ScanLogs/$(date +'%Y-%m-%d::%H-%M-%S')
fi
done
echo -e "$RED Temps d'execution: $(($(date +%s)-$ptime)) secondes $NC"
done
- Edité par Bhasher 23 septembre 2017 à 15:34:23
CodeWe is an open-source live code-sharing website.
tu ajoutes des complications parce que ton script n'est pas optimisé.
je ne vois vraiment pas l'utilité de toutes ces boucles : c'est tous les cut, et autres commandes externes, qui ralentissent ton script. remplace-les par des Remplacements de paramètres, et ton script sera bien plus rapide; alors tu verras que les boucles sont inutiles.
while true :
do
printf -v ptime '%(+%s)T'
#Recherche des ips et Mise en tableau des ips
tab=( $(timeout 15 fping -g -a -q 192.168.1.0 192.168.1.255) )
for ip in ${tab[@]}
do
addrIP="${ip##*.}"
printf -v debScan '%(%s)T'
read macaddr["$addrIP"] marque["$addrIP"] < <(sudo nmap -sP -PE "$ip" | awk '/MAC/{gsub("[)(]","",$4);print $3,$4}')
#il faut améliorer cet awk pour indiquer qu'une valeur à afficher existe ou pas
printf -v finScan '%(%s)T'
dureeScan=$((finScan-debScan))
done
done
en gros...
les tableaux macaddr et marque ne devraient plus être utiles non plus.
- Edité par dantonq 24 septembre 2017 à 17:38:48
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
Même un ping de type ARP ne détecte pas tout les appareils (12/14 chez moi), alors que fping a bien les 14 appareils.
J'étais un peu surpris de ce résultat, du coup je suis allé jeter un coup d'oeil sur la page de manuel de nmap puis j'ai fais quelques tests avec Wireshark. Il semblerait que le scan Ping (option -sP) à un comportement différent en fonction de l'utilisateur qui lance la commande et en fonction du réseau sur lequel le scan est réalisé. La technique de détection de l'hôte peut changer :
usager non-privilégié : "ping" TCP SYN sur le port 80
usager privilégié avec un scan du réseau local (Ehernet) : ping ARP
Il est possible de forcer la méthode de détection utilisé en spécifiant une option supplémentaire :
# ping TCP SYN
nmap -sP -PS 192.168.0.*
# ping TCP ACK
nmap -sP -PA 192.168.0.*
# ping UDP
nmap -sP -PU 192.168.0.*
# pour changer de port (defaut 80), exemple TCP SYN / port 22 :
nmap -sP -PS22 192.168.0.*
# ping ARP
# ATTENTION il faut etre root
nmap -sP -PR 192.168.0.*
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
CodeWe is an open-source live code-sharing website.
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
CodeWe is an open-source live code-sharing website.
GNU/Linux SysAdmin - un blog sur les lignes de commande GNU/Linux (mikael-flora.fr)
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
CodeWe is an open-source live code-sharing website.
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
CodeWe is an open-source live code-sharing website.
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
CodeWe is an open-source live code-sharing website.
GNU/Linux SysAdmin - un blog sur les lignes de commande GNU/Linux (mikael-flora.fr)
CodeWe is an open-source live code-sharing website.
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
GNU/Linux SysAdmin - un blog sur les lignes de commande GNU/Linux (mikael-flora.fr)
GNU/Linux SysAdmin - un blog sur les lignes de commande GNU/Linux (mikael-flora.fr)