Pour les scripts : c'est ici

NEW CODE !!! (enfin en parti)

  • rapide! (15sec pour une plage complete (0-254))
  • peu être lancé en tant que simple utilisateur.
  • Bug: Maintenant la boucle des ping s’arrete tout le temps.

ps: si quelqu’un a le courage de changer tout les ‘cat|awk|grep|wc’ avec leurs chemins complets du style /bin/cat.
Perso je n’en vois pas trop l’utilité.

#!/bin/bash                                                                       
# version 0.7                                                                     

#Ping options
PING="/bin/ping"
PING_NUMBER=1   
PING_TIMEOUT=3 #pour gagner un peu en vitesse
PING_DEVICE=eth-station #Device              

# get the prefix of the network broadcast address ie: 192.168.1
IFCONFIG="/sbin/ifconfig"                                      
if [ -x "$IFCONFIG" ]; then                                    
  IP_PREFIX=`$IFCONFIG |awk '/Bcast:/ { sub("Bcast*:","") ; sub(".255","") ; print $3 }'`                                                                             
  IP_LOCALE=`$IFCONFIG -a $PING_DEVICE | awk '/inet adr/ { sub("adr:","") ; print $2 }'`                                                                              
else                                                                               
  IP_PREFIX="192.168.1"                                                            
  IP_LOCALE="192.168.1.1"                                                          
fi                                                                                 

#Variables importante.
PROCESS_MAX=35  #Process simultanné maximum (Après 50 process j'obtiens des erreurs)                                                                                  
PROCESS_FINAL=254 #Nombre Maximum de process a executer (entre 1 et 254)(boucle)   
PROCESS_NUMBER=1 #Nombre de process executé (Valeur a ne pas modifier)             
PROCESS_CURRENT=0 #Nombre de process en cours (Valeur a ne pas modifier)           

case $@ in
        exemple )                       MAC="aa:bb:cc:dd:ee:ff" ;;
        windowsxp_virt )                MAC="08:00:27:89:3d:fe" ;;
        * )                             ALL=true ;;               
esac                                                              

function get_ip(){
if [ "$PROCESS_CURRENT" -lt "$PROCESS_FINAL" ]; then
  PING=`"$PING" -c$PING_NUMBER -w$PING_TIMEOUT $IP_PREFIX.$PROCESS_CURRENT`
fi                                                                         
}                                                                          

function get_process(){
PROCESS_NUMBER=`ps ux|grep -v grep|grep "$PING"|wc -l`
}                                                     

function get_mac(){
NAME_MAC=`awk '/'"$MAC"'/ { print $1 }' $0`
NAME_IP=`cat /proc/net/arp | awk '! /00:00:00:00:00:00/ && /'$MAC'/ { print $1 }'`
}                                                                                 

#Histoire de remplir la liste arp de facon plus rapide qu'une simple boucle for
while [ "$PROCESS_NUMBER" -lt 2 ] || [ "$PROCESS_CURRENT" -lt 10 ] || [ "$PROCESS_CURRENT" -lt "$(( $PROCESS_FINAL + 20 ))" ]; do                                     
  PROCESS_CURRENT=$(( $PROCESS_CURRENT + 1 ))                                      
    if [ "$PROCESS_NUMBER" -lt "$PROCESS_MAX" ]; then                              
      get_ip &                                                                     
    else                                                                           
      sleep 0.1s                                                                   
    fi                                                                             
  get_process                                                                      
#echo $PROCESS_NUMBER $PROCESS_CURRENT                                             
done                                                                               

#Finale Arp
MAC_ALIVE=`cat /proc/net/arp | awk '! /00:00:00:00:00:00/ && ! /IP address/ { print $4 }'`
for MAC in $MAC_ALIVE; do
get_mac
if [ "$ALL" == "true" ]; then
    if [ "$NAME_MAC" == "" ]; then
        NAME_MAC=$MAC
    fi
    echo $NAME_IP $NAME_MAC
else
    echo $NAME_IP
    exit 0
fi
done

Re,

[quote]gerard@debian:~/bin$ ./essai
192.168.0.1 00:c0:02:2c:47:2a
[/quote]

Il me manque le 192.168.0.4 qui est la machine depuis laquelle j’ai lancé !

On va dire que c’est normal… car lorsqu’on ping notre adresse IP depuis notre adresse ip, on n’écrit pas dans la table arp, mais on doit passer par 127.0.0.1

D’habitude je detectais l’adresse de la machine depuis laquelle on lancait le script d’une manière “crade”.

Il suffit de rajouter (c’est sale mais bon…) :

Pour que ca ressemble a: ( ligne ~76)

...
#Finale Arp
MAC_ALIVE=`cat /proc/net/arp | awk '! /00:00:00:00:00:00/ && ! /IP address/ { print $4 }'`

echo $IP_LOCALE `hostname`

for MAC in $MAC_ALIVE; do
get_mac
...

Re,

Mais à part cela tu lui as fait manger du lion :smiley:

Merci, content que ça serve à au moins deux personnes moi compris :smiley:

Et encore je viens de faire une derniere petite modification/optimisation, histoire d’utiliser un petit peu moins ‘ps ux’.

Maintenant, pour scanner tout le réseau je met 6.590sec :smiley: avec 20% d’utilisation cpu en moins! le seul soucis c’est que ca doit être limite pour les derniers ping … (comprendre les 25 derniers pings, soit les ip comprises entre 192.168.X.230 et 192.168.X.254)

Re,

Tu redonnes quelque part le résultat final ?

Je reposte l’utilisation du script:

-Modifier la ligne pour correspondre avec votre carte réseau:
PING_DEVICE=eth0 #Device (ifconfig -a)

-Lancer le script une première fois sans arguments, histoire de récupérer les adresses MAC sur votre réseau.

-Modifier le script une seconde fois pour qu’il corresponde a votre réseau, avec toute les adresses mac de votre réseau.

case $@ in
        nomdelamachine_facilearetenir )                MAC="08:00:27:89:3d:fe" ;;
        autremachinedureseau )                        MAC="aa:bb:cc:dd:ee:ff" ;;
....
....
        * )                             ALL=true ;;
esac

-deux facons de lancer le programme:
\sans aucuns argument pour avoir une liste de tout les pc connecté sur le réseau.
\avec comme argument le nomdelamachine_facilearetenir, et vous aurez comme resultat simplement l’ip du pc

  • Et Puis c’est tout :smiley:
#!/bin/bash
# version 1-finale ?
# Script permettant de lister tout les pc sur un réseau par rapport à leurs adresses MAC
# Ou permettant de retrouver l'IP d'un PC par rapport a l'adresse MAC

#Ping options
PING="/bin/ping"
PING_NUMBER=1
PING_TIMEOUT=1 #pour gagner un peu en vitesse
PING_DEVICE=eth-station #Device

# get the prefix of the network broadcast address ie: 192.168.1
IFCONFIG="/sbin/ifconfig"
if [ -x "$IFCONFIG" ]; then
  IP_PREFIX=`$IFCONFIG |awk '/Bcast:/ { sub("Bcast*:","") ; sub(".255","") ; print $3 }'`
  IP_LOCALE=`$IFCONFIG -a $PING_DEVICE | awk '/inet adr/ { sub("adr:","") ; print $2 }'`
else
  IP_PREFIX="192.168.1"
  IP_LOCALE="127.0.0.1"
fi

#Variables importante.
PROCESS_MAX=30  #Process simultanné maximum (Après 50 process j'obtiens des erreurs)
PROCESS_FINAL=254 #Nombre Maximum de process a executer (entre 1 et 254)(boucle)
PROCESS_NUMBER=1 #Nombre de process executé (Valeur a ne pas modifier)
PROCESS_CURRENT=0 #Nombre de process en cours (Valeur a ne pas modifier)
PROCESS_PS_MAX=5 #Petit Hack pour ne pas trop utiliser `ps ux`
PROCESS_PS=$PROCESS_PS_MAX #Memoire :D

#Rajouter/modifier les adresses MAC pour correspondre a votre réseau
case $@ in
        windowsxp_virt )                MAC="08:00:27:89:3d:fe" ;;
        * )                             ALL=true ;;
esac

function get_ip(){
if [ "$PROCESS_CURRENT" -lt "$PROCESS_FINAL" ]; then
  PING=`"$PING" -c$PING_NUMBER -w$PING_TIMEOUT $IP_PREFIX.$PROCESS_CURRENT`
fi
}

function get_process(){
PROCESS_PS=$(( $PROCESS_PS - 1 ))
if [ "$PROCESS_PS" -le 0 ]; then
PROCESS_NUMBER=`ps ux|grep "$PING"|wc -l`
  if [ "$PROCESS_CURRENT" -lt "$PROCESS_FINAL" ]; then
    PROCESS_PS=$PROCESS_PS_MAX
  else
    PROCESS_PS=$(( $PROCESS_PS_MAX + $PROCESS_PS_MAX ))
    wait
  fi
fi
}

function get_mac(){
NAME_MAC=`awk '/'"$MAC"'/ { print $1 }' $0`
NAME_IP=`cat /proc/net/arp | awk '! /00:00:00:00:00:00/ && /'$MAC'/ { print $1 }'`
}

#Histoire de remplir la liste arp de facon plus rapide qu'une simple boucle for
while [ "$PROCESS_NUMBER" -gt 3 ] || [ "$PROCESS_CURRENT" -lt 20 ] || [ "$PROCESS_CURRENT" -lt "$PROCESS_FINAL" ]; do
    if [ "$PROCESS_NUMBER" -lt "$PROCESS_MAX" ]; then
      PROCESS_CURRENT=$(( $PROCESS_CURRENT + 1 ))
      get_ip &
    else
      sleep 0.1s
    fi
  get_process
#echo $PROCESS_NUMBER $PROCESS_CURRENT
done

#Finale Arp
MAC_ALIVE=`cat /proc/net/arp | awk '! /00:00:00:00:00:00/ && ! /IP address/ { print $4 }'`
if [ "$1" == "" ]; then #HORRIBLE hack pour afficher l'adresse du scanneur
 echo $IP_LOCALE `hostname`
fi

for MAC in $MAC_ALIVE; do
get_mac
if [ "$ALL" == "true" ]; then
    if [ "$NAME_MAC" == "" ]; then
	NAME_MAC=$MAC
    fi
    echo $NAME_IP $NAME_MAC
else
   if [ "$1" == "$NAME_MAC" ]; then
    echo $NAME_IP
    exit 0
   fi
fi
done

J’espère ne pas avoir trop polué le post :smiley:

tu ne pollue pas au contraire je dirais que tu la embelli avec ton script !!
merci pour se bon petit script :wink: :wink:

un petit bout de code qui permet effacer un terminal.
normalement un reset ou un clear suffi,seulement si on remonte avec l’escenceur (pour le terminal du nom de konsole) on y voit toujours le résulta précédant ce qui peut être génant. attention a ne pas confondre avec un history -c qui a pour effet de supprimer historique des commande passée.

Alors pour finir l’année avec un petit script, en voila un qui permet de visualiser en live la vitesse d’un périphérique réseau ou disque.
Utile pour vérifier qu’un transfert fonctionne bien!
Biensur il n’est pas très précis, il aurait fallu utiliser “bc” mais ca aurait été plus lourd et moins portable.
Il fait la même chose que iotop,netperf, etc… mais en beaucoup plus léger et simple d’utilisation!

Pour savoir comment il fonctionne, il suffit de le lancer sans aucuns arguments (ou -h):smiley:

ps: il doit avoir pas mal de bug/problemes, merci de les remonter/voir corriger :smiley:

#!/bin/bash
# Script de visualisation de vitesse
# version 0.2
# ATTENTION ce n'est pas très "accurate", précision proche de zéro quoi ;-)

LISTING=0
TIME=1
FAKE_TIME=` echo "scale=0;( $TIME - $TIME * 1 / 100)" | bc ` #Utilisé pour palié au temps d'execution des commandes.

function echo_help() {
echo "usage:
 exemple: basename [-t secondes] [périphérique] | -l | -h
 -t rafraichissement (pas tester... beta)
 -l liste les périphérique
 -h : affiche cette aide"
exit 0
}

function echo_liste() {
DEVICE_NET=` awk '/\:/{ sub(":.*","" ); print $1 }' /proc/net/dev `
DEVICE_IO=` awk '{ print $3 }' /proc/diskstats`
if [ "$LISTING" -eq 1 ]; then
	echo "Périphériques réseaux:"
	echo $DEVICE_NET
	echo ""
	echo "Périphériques disques:"
	echo $DEVICE_IO
	exit 0
fi
}

while getopts ":t:lh" opt; do
	case $opt in
		t)
		TIME="$OPTARG"
		;;
		l)
		LISTING=1
		;;
		h)
		echo_help
		;;
		\?)
		echo "Option invalide: -$OPTARG" >&2
		exit 1
		;;
		:)
		echo "L'option -$OPTARG a besoin d'un argument." >&2
		exit 1
		;;
	esac
done

if [ "$1" != "" ]; then
	echo_liste
	INTERFACE="$1"
	if [ "` echo $DEVICE_NET | grep $INTERFACE `" != "" ];then
		DEVICE="NET"
		TEXT_READ="Download"
		TEXT_WRITE="Upload"
		KB_MB=1
	elif [ "`echo $DEVICE_IO | grep $INTERFACE `" != "" ]; then
		DEVICE="IO"
		TEXT_READ="Read"
		TEXT_WRITE="Write"
		KB_MB="1024 * 512 / 1024"
	else
		echo "couille dans le pate"
		exit 1
	fi
else
	echo_help
fi

# Maintenant qu'on a un périphérique et que l'on connait le type, on peut commencer.
#echo $INTERFACE
#echo $DEVICE

function speed_caliber() { # Permet de calibrer la vitesse. (au premier abord ca fait peur mais c'est tout simple)
	TEMP_RATE=$(( ( $TEMP_RATE2 - $TEMP_RATE1 ) * $KB_MB / $TIME ))
	if [ "$TEMP_RATE" -ge 1024 ]; then
		TEMP_RATE=$(( $TEMP_RATE / 1024 ))
		SPEED_RATE="KB/s"
		if [ "$TEMP_RATE" -ge 1024 ]; then
			TEMP_RATE=$(( $TEMP_RATE / 1024 ))
			SPEED_RATE="MB/s"
		fi
	else
		SPEED_RATE="B/s"
	fi
}

function get_size() { # Permet d'avoir la quantité de donnée total a un instant T.
	if [ "$DEVICE" == "IO" ]; then
		if [ "$FRONT" == "READ" ]; then
			COLUMN_WRITE=4
			COLUMN_SIZE=6	
		elif [ "$FRONT" == "WRITE" ]; then
			COLUMN_WRITE=8
			COLUMN_SIZE=10
		fi
		TEMP_SIZE=` awk '/'"$INTERFACE"'[^0-9]/ { print $'$COLUMN_SIZE' }' /proc/diskstats `
	elif [ "$DEVICE" == "NET" ];then
		if [ "$FRONT" == "READ" ]; then
			COLUMN=1
		elif [ "$FRONT" == "WRITE" ]; then
			COLUMN=9
		fi	
		TEMP_SIZE=` cat /proc/net/dev | awk '/'"$INTERFACE"':/ { print $'$COLUMN' }' | sed s/\^.*\://g ` # Le sed est utilisé uniquement pour le download
	fi
	if [ "$TEMP_SIZE" == "" ]; then
		tput rc
		exit 1
	fi
}

#on récupère la position;
tput sc
echo -n "Starting"

while [ 1 ]; do

	## En gros on recupère les données Total READ et WRITE:  T et T + 1seconde 
	FRONT="READ"; get_size
	READ1=$TEMP_SIZE
	FRONT="WRITE"; get_size
	WRITE1=$TEMP_SIZE

	sleep $FAKE_TIME  ## Le petit sleep necessaire ;) (moins un minuscule temps pour l'opération)

	FRONT="READ"; get_size
	READ2=$TEMP_SIZE
	FRONT="WRITE"; get_size
	WRITE2=$TEMP_SIZE


	#MEGA_POWER!!! on calibre B->KB->MB...
	#READ_SIDE
	TEMP_RATE1=$READ1
	TEMP_RATE2=$READ2
	speed_caliber
	T_READ=$TEMP_RATE
	READ_SPEED=$SPEED_RATE

	#WRITE_SIDE
	TEMP_RATE1=$WRITE1
	TEMP_RATE2=$WRITE2
	speed_caliber
	T_WRITE=$TEMP_RATE
	WRITE_SPEED=$SPEED_RATE

	#affichage du bouzin
	tput el1
	tput rc
	echo -n "$TEXT_READ: $T_READ $READ_SPEED"  "$TEXT_WRITE: $T_WRITE $WRITE_SPEED"

done

Joyeux Noël

Des commandes dans ce genre? Ou j’ai tout faux?

wget -O - -q http://ip.tupeux.com | tail

et (à améliorer)

Des commandes dans ce genre? Ou j’ai tout faux?

wget -O - -q http://ip.tupeux.com | tail

et (à améliorer)

Exactement ce style de commande sauf que:

Je n’aime pas être dépendant d’un site web, pour 2 raisons: si il vient a fermer ou a changer ca page … script tout cassé.
Si la machine n’a pas internet (et justement on voudrait bien scanner le réseau complet pour voir ou est cette passerelle qui nous permet de surfer!) bah le script ne fonctionne pas.
Mais l’idée est bonne :smiley:
Je pensais plus a un truc dans /sys /proc etc… consultable pour tout utilisateur.

Pour ce qui est de ifconfig, ggoodluck47 avait écrit que les logiciels étant dans /sbin/ sont pour les admins/root, et non pour un simple utilisateur.
(ps ca vaudrait dire que 95% des distributions linux par défaut le configure mal menfin…)

Mais dans ce genre oui :smiley:

[quote=“zelogik”]Si la machine n’a pas internet (et justement on voudrait bien scanner le réseau complet pour voir ou est cette passerelle qui nous permet de surfer!) bah le script ne fonctionne pas.
Mais l’idée est bonne :smiley:[/quote]
Connaître le débit internet d’une machine pas connectée à internet c’est pas d’une grande utilité. Si c’est l’adresse local dont tu as besoin le site ne pourras rien pour toi.

Salut,

[quote]Pour ce qui est de ifconfig, ggoodluck47 avait écrit que les logiciels étant dans /sbin/ sont pour les admins/root, et non pour un simple utilisateur.
(ps ca vaudrait dire que 95% des distributions linux par défaut le configure mal menfin…)
[/quote]

Toutes les distributions, je ne sais pas, mais toutes les Debian ou dérivées que j’ai testées (verifiez le PATH)

J’en profite puisque nous sommes dans les scripts :slightly_smiling:

Bonjour,

Très simple utilisateur, débianiste modeste, tout à fait incapable de “scripter” quoique ce soit, quand je veux connaitre l’IP et le masque de sous réseau d’une machine de la maison, je tape tout simplement

ifconfig

Et ma foi j’ai le résultat.
Tout au moins il me semble, mais çà ne vaut que pour la machine sur laquelle j’ouvre le terminal, pas pour celle d’à côté.
Miracle ? Peut-être mon projet de voyage à Lourdes ?

Re,

[quote]gerard@debian:~$ ifconfig
bash: ifconfig : commande introuvable
gerard@debian:~$ path
/home/gerard/bin
/home/gerard/bin
/usr/local/bin
/usr/bin
/bin
/usr/games
gerard@debian:~$
[/quote]

Après les gouts et les couleurs :
[code]echo $PATH | tr ':' '\n'
echo $PATH | sed 'y/:/\n/'[/code]
 :laughing: (j'aime bien tr)

Après les gouts et les couleurs :

echo $PATH | tr ':' '\n' echo $PATH | sed 'y/:/\n/'
:laughing: (j’aime bien tr)

[quote]gerard@debian:~$ ifconfig
bash: ifconfig : commande introuvable[/quote]

Je ne sais pas trop ce que tu veux dire mais :

eggregor@debian ~ $ ifconfig
eth0 Link encap:Ethernet HWaddr 00:0f:ea:2e:f5:7f
inet adr:192.168.0.10 Bcast:192.168.0.255 Masque:255.255.255.0

Mais encore une fois çà peut tenir à mon projet de voyage à Lourdes, y’a du miraculeux ?

comme deja expliquer c’est une histoire de path
le ifconfig est dans /usr/sbin/
et dans beaucoup de distri c’est mal configurer est donc tu as le droit d’y acceder alors que tu ne devrait pas

Des commandes dans ce genre? Ou j’ai tout faux?

wget -O - -q http://ip.tupeux.com | tail

et (à améliorer)

Exactement ce style de commande sauf que:

Je n’aime pas être dépendant d’un site web, pour 2 raisons: si il vient a fermer ou a changer ca page … script tout cassé.
Si la machine n’a pas internet (et justement on voudrait bien scanner le réseau complet pour voir ou est cette passerelle qui nous permet de surfer!) bah le script ne fonctionne pas.
Mais l’idée est bonne :smiley:
Je pensais plus a un truc dans /sys /proc etc… consultable pour tout utilisateur.

Pour ce qui est de ifconfig, ggoodluck47 avait écrit que les logiciels étant dans /sbin/ sont pour les admins/root, et non pour un simple utilisateur.
(ps ca vaudrait dire que 95% des distributions linux par défaut le configure mal menfin…)

Mais dans ce genre oui :smiley:[/quote]

Il y a des milliers de sites avec lesquels tu peux utiliser cette commande. J’en avais aussi une dans le même genre pour whatismyip.com. De plus, l’avantage est que, passant par http, si la machine est connectée à Internet, il y a 99% de chances que ça marche. Après, tu peux créer un script à mettre dans /usr/local/bin pour qu’il s’execute tout seul quand on tape son nom.

Pour ifconfig, tu peux créer un groupe sudo juste pour cette commande, qui ne demande pas le mot de passe utilisateur, ça marche assez bien.