Pour les scripts : c'est ici

Si tu pars là dessus…

[quote=“ezano”]Salut, je suis en première année d’iut info et on a débuté les script bash =)
Je trouve ce langage de programmation très interessant et bien sûr il faut que je m’entraine, je ne maitrise rien du tout, j’ai pris mes repères dans le langage C ça fait déjà un moment et du coup j’ai tendance à oublier quelques fonctionnalités du bash.

Je post donc un script très basique car ce n’est que mon premier script =) mais qui peut s’avérer utile si on veux modifier l’extension d’un seul voire de plusieurs fichiers.

Après je ne sais pas, j’ai peut être oublié des sécurités, mais personnellement je n’en voit pas d’autre à rajouter.
Maintenant je ne pense pas que vous ayez besoin de commentaires pour ça, il est très court et très simple, si vous avez des avis dessus n’hésitez pas, je compte faire beaucoup de bash ce week end.[/quote]
oui, oui, j’ai du temps à perdre…

Mais naaan j’hallucine j’ai ecris “m’aitriser” ^^ j’en rigole moi même devant mon pc.

[quote]Si le but de ton script est de découvrir le bash, alors c’est bien.
Si le but est de renommer plusieurs fichiers, tu peux faire la même chose en une seule ligne avec la commande : find :wink:
[/quote]

J’ai survolé le man de la commande find et je n’ai trouvé aucun paramètre de renommage, de plus c’est seulement les extensions que le script renomme, je suis pas sur que find fasse ça, si je me trompe j’aimerais bien savoir comment faire.

Sinon évidemment le but était de m’entraîner au bash, pas de faire un script absolument nécessaire, pour ça je vais attendre d’avoir un peu plus de pratique dans le domaine.

Pour remplacer les *.ext par les *.txt par exemple.

Pour remplacer les *.ext par les *.txt par exemple.

[quote=“ezano”]J’ai survolé le man de la commande find [/quote]Bien, le man c’est un bon réflexe. 1 bon point pour toi.

[quote=“ezano”]si je me trompe j’aimerais bien savoir comment faire.[/quote]C’est peut-être mon côté “sadique”, contrairement à MisterFreez, je t’aurais laissé chercher.
Je trouve que c’est plus formateur.

[quote=“Enifael”][quote=“ezano”]si je me trompe j’aimerais bien savoir comment faire.[/quote]C’est peut-être mon côté “sadique”, contrairement à MisterFreez, je t’aurais laissé chercher.
Je trouve que c’est plus formateur.[/quote]
Je suis relativement généreux en matière de RTFM de manière général.

Merci pour la commande, elle est très complexe par rapport à ce que j’ai besoin de taper avec mon script pour faire la même chose:

Ca fonctionne très bien et c’est beaucoup plus facile à retenir, d’ailleur félicitation si tu as réussit à ressortir cette commande de tête elle est imbuvable ^^ mais je reconnais que je me suis trompé.

C’est parce qu’il parlait de find. Moi je ferais plutôt comme ça :

for file in **/*.ext do mv $file ${file/.ext/.next}; done

C’est carrément plus claire non ? Surtout si tu as un peu l’habitude de bidouiller des regexp.
Au niveau des sécurités du profite de celles de mv.

Si tu veut de l’uniligne réellement compliqué à lire, tu peut jouer avec sed :laughing: :

Avec awk maintenant :

Et oui sauf pour la commande avec awk le reste je regarde pas la doc (ni je teste d’ailleurs).

Bonjour,

Voila un petit script qui a evolué au fil des temps, au début il affichait juste le nombre de pc connecté sur le réseau et les ip correspondantes. (un peu comme les scripts déjà existant sur le forum)

Puis je voulais repérer facilement tout mes pc par rapport aux adresses MAC sans fichiers de configuration supplémentaire.
Puis il est devenu rapide! (enfin c’est relatif), 20sec pour une plage complète (1-254)

Fonctionne très simplement:

  • sans aucuns paramètres, il donne la liste complète des pc connectés sur le réseau.(ip + nom_correspondant)
  • avec le nom du pc, il va juste afficher l’ip du pc correspondant.

Parametre à modifier:

  • PING_DEVICE (le périphérique a utiliser: wlan0, eth0 etc… (ifconfig))
  • une liste de vos pc connecté sur votre réseau à modifier directement dans le script
  • normalement c’est tout …

Donc voila le résultat:
-lancer le une première fois en modifiant juste le $PING_DEVICE, et vous aurez une liste avec l’ip et l’adresse MAC correspondante pour chaque pc connecté.
-modifier la liste suivant l’exemple déjà ecrit.

#!/bin/bash                                                                       
# version 0.5                                                                     

#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
IP_PREFIX=`ifconfig |awk '/Bcast:/ { sub("Bcast*:","") ; sub(".255","") ; print $3 }'`                                                                                

#Locale stuff ... récupère l'ip du pc
IP_LOCAL=`ifconfig -a $PING_DEVICE | awk '/inet adr/ { sub("adr:","") ; print $2 }'`                                                                                  

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

#Modifier/ajouter autant de pc que vous voulez!
case $@ in
        1-box )                       MAC="aa:bb:cc:dd:ee:ff" ;;
        2-box )                       MAC="aa:bb:cc:dd:ee:ff" ;;
        3-box )                       MAC="aa:bb:cc:dd:ee:ff" ;;
        whatyouwant-box )             MAC="aa:bb:cc:dd:ee:ff" ;;
        * )                           ALL=true ;;               
esac                                                              

function get_ip(){
if [ "$PROCESS_CURRENT" -lt "$PROCESS_FINALE" ]; 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() {
MAC_ADDRESS=`arp -i$PING_DEVICE -a $IP_PREFIX.$IP | awk '{ print $4 }'`
if [ "$MAC_ADDRESS" == "<incomplete>" ]; then                          
 NAME_MAC="null"                                                       
elif [ "$MAC_ADDRESS" == "trouvée" ]; then #Bad trick ...              
   if [ "$IP_LOCAL" == "$IP_PREFIX.$IP" ]; then                        
     NAME_MAC=`hostname`                                               
   else                                                                
     NAME_MAC="null"                                                   
   fi                                                                  
else                                                                   
  NAME_MAC=`awk '/'"$MAC_ADDRESS"'/ { print $1 }' $0` #Donne le nom par rapport au programme lancé                                                                    
  if [ "$NAME_MAC" == "" ]; then                                                   
    NAME_MAC="$MAC_ADDRESS"                                                        
  fi                                                                               
fi                                                                                 
}                                                                                  


#Histoire de remplir la liste arp de facon plus rapide qu'une simple boucle for
while [ "$PROCESS_NUMBER" -ne 5 ] || [ "$PROCESS_CURRENT" -lt 10 ] || [ "$PROCESS_CURRENT" -lt "$PROCESS_FINALE" ]; 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
for IP in `seq 1 $PROCESS_FINALE`;do
 get_mac
 if [ "$ALL" == "true" ]; then
   if [ "$NAME_MAC" != "null" ]; then
     echo $IP_PREFIX.$IP $NAME_MAC
   fi
 elif [ "$NAME_MAC" == "$1" ]; then
  echo $IP_PREFIX.$IP
  exit 0
 fi
done

Voila le resultat obtenu sur mon pc (testé avec une debian et une fedora)

time ip_network                                       [~]
192.168.1.1 livebox
192.168.1.2 photosmart
192.168.1.14 LogikPC
192.168.1.15 lenovo_y310_3945
192.168.1.16 DS409
192.168.1.40 alix_wan

ip_network  3,05s user 7,42s system 48% cpu 21,508 total

pas compris a quoi cela sert de modifier la liste ?

Salut,

1 - Rappeler comment rendre ifconfig exécutable par le commun des mortels :slightly_smiling:

2 - simultanné ==> simultané

[quote=“ggoodluck47”]Salut,

1 - Rappeler comment rendre ifconfig exécutable par le commun des mortels :slightly_smiling: simultané[/quote]
hu? Qu’est ce que tu entends pas la ?

IFCONFIG=/sbin/ifconfig ?

Ou bien qu’un simple utilisateur ne peut pas l’executer …
car sur tout les pc que j’ai pu utilisé depuis 10ans, ifconfig est accessible par un simple utilisateur …

Ah oui il doit y avoir un bug, lorsque le pc n’a pas pour locale le français …

la commande arp doit renvoyé autre chose que “arp: aucune correspondance trouvée dans 3 entrées”

et donc ca ne doit pas être filtré comme voulu …

Ca sert a donner un nom “human readable” pour chaque adresse MAC du son réseau et donc de savoir qu’elle pc a qu’elle ip, sur un réseau DHCP c’est assez pratique lorsque l’on a plus de 10pc et un leasing faible.

exemple, chez moi j’ai:

case $@ in
        livebox )                       MAC="00:25:69:XX:XX:XX" ;;
        photosmart )                    MAC="00:14:38:XX:XX:XX" ;;
        laciebd )                       MAC="00:d0:4b:XX:XX:XX" ;;
        alix_lan )                      MAC="00:0d:b9:XX:XX:XX" ;;
        alix_wan )                      MAC="00:0d:b9:XX:XX:XX" ;;
        alix_wifi )                     MAC="00:0b:6b:XX:XX:XX" ;;
        lenovo_y310_3945 )              MAC="00:1c:bf:XX:XX:XX" ;;
        lenovo_y310_ether )             MAC="00:1b:24:XX:XX:XX" ;;
        sonyfz11_wifi )                 MAC="00:1b:77:XX:XX:XX" ;;
        asus_ether )                    MAC="00:1b:fc:XX:XX:XX" ;;
        asus_wifi )                     MAC="00:13:e8:XX:XX:XX" ;;
        smc_wifi )                      MAC="00:04:e2:XX:XX:XX" ;;
        DS409 )                         MAC="00:11:32:XX:XX:XX" ;;
        * )                             ALL=true ;;
esac

Re,

Depuis quand les commandes situées en /sbin sont-elles accessibles aux utilisateurs ?
J’essaye d’être constructif, je trouve ton script intéressant, je sais aussi comment le rendre exécutable pour moi :slightly_smiling:

Effectivement le /sbin est pour les executable en root-only normalement, et pourtant j’ai une debian, une ubuntu, et une fedora et par défaut toute les distributions autorisent l’accès a ce répertoire et aux applications a l’intérieur… Donc je ne voyais pas ou était le probleme, maintenant trouvé une autre commande histoire d’avoir l’ip et le masque réseau assez facilement… humhumm a voir :wink:

Excuse si tu t’es senti agressé, ce n’était pas mon but, je ne comprenais pas ou tu voulait en venir c’est tout!

ps: le script n’est pas bug-free loin de la, j’en vois bien une dizaine mais aucunes bien grave :wink:

Aller c’est mon jour de bonté :smiley:

Voila un script permettant de voir la vitesse de votre connexion dans une console.

IMPORTANT:
Il faut renommer le script avec le nom de l’interface que vous voulez surveiller.
ifconfig pour tout les avoir.
Pour quitter, ctrl^c.

#!/bin/bash

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

TIME=1 # temps en seconde entre chaques intervalle, utilisé pour le calcul (eviter en dessous de 1s pour l'instant )
INTERFACE=` basename $0 ` # "ifconfig" -> celle qui nous va bien
FAKE_TIME=` echo "scale=2;( $TIME - $TIME * 1 / 100)" | bc ` #Utilisé pour palié au temps d'execution des commandes.(dirt but work)

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 ) / $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 [ "$FRONT" == "DL" ]; then
		COLUMN=1
	elif [ "$FRONT" == "UL" ]; then
		COLUMN=9
	fi
	
	TEMP_SIZE=` cat /proc/net/dev | awk '/'"$INTERFACE"':/ { print $'$COLUMN' }' | sed s/\^.*\://g ` # Le sed est utilisé principalement/uniquement pour le download

	if [ "$TEMP_SIZE" == "" ]; then
		tput rc
		exit 1
	fi
}


while [ 1 ]; do

	## En gros on recupère les données Total DL et UL:  T et T + 1seconde 
	FRONT="DL"; get_size
	DL1=$TEMP_SIZE
	FRONT="UL"; get_size
	UL1=$TEMP_SIZE

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

	FRONT="DL"; get_size
	DL2=$TEMP_SIZE
	FRONT="UL"; get_size
	UL2=$TEMP_SIZE


	#MEGA_POWER!!! on calibre B->KB->MB...
	#DL_SIDE
	TEMP_RATE1=$DL1
	TEMP_RATE2=$DL2
	speed_caliber
	T_DL=$TEMP_RATE
	DL_SPEED=$SPEED_RATE

	#UL_SIDE
	TEMP_RATE1=$UL1
	TEMP_RATE2=$UL2
	speed_caliber
	T_UL=$TEMP_RATE
	UL_SPEED=$SPEED_RATE

	#affichage du bouzin
	tput el1
	tput rc
	echo -n "DL: $T_DL $DL_SPEED"  "UL: $T_UL $UL_SPEED"

done

Re,

Non pas agressé, mon but est de t’aider. Je trouve l’idée très intéressante. Savoir qui est connecté à la portée de tous les utilisateurs est un plus réel :slightly_smiling:

Si on me trouve une commande accessible pour un simple utilisateur, qui me renvoie l’ip et le masque de sous réseau je suis preneur :wink:

dans /proc/net je n’ai rien vu d’intéressant, peut être dans /sys …

Sinon simplement, changer:

  • IP_PREFIX=ifconfig |awk '/Bcast:/ { sub("Bcast*:","") ; sub(".255","") ; print $3 }'
  • IP_PREFIX=“192.168.0”
  • IP_LOCALE=ifconfig -a $PING_DEVICE | awk '/inet adr/ { sub("adr:","") ; print $2 }'
  • IP_LOCALE=hostname

nouvelle version:

#!/bin/bash
# version 0.6

#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.0"
  IP_LOCALE=`hostname`
fi

#Locale stuff .. pas spécialement propre mais ca fonctionne
#MAC_LOCAL_TMP=`ifconfig -a $PING_DEVICE | awk '/HWaddr/ { print $5 }'`
#MAC_LOCAL=`echo $MAC_LOCAL_TMP | tr "[:upper:]" "[:lower:]"`

#Variables importante.
PROCESS_MAX=30  #Process simultanné maximum (Après 50 process j'obtiens des erreurs)
PROCESS_FINAL=54 #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() {
MAC_ADDRESS=`arp -i$PING_DEVICE -a $IP_PREFIX.$IP | awk '{ print $4 }'`
if [ "$MAC_ADDRESS" == "<incomplete>" ]; then
 NAME_MAC="null"
elif [ "$MAC_ADDRESS" == "trouvée" ]; then #Bad trick ...
   if [ "$IP_LOCALE" == "$IP_PREFIX.$IP" ]; then
     NAME_MAC=`hostname`
   else
     NAME_MAC="null"
   fi
else
  NAME_MAC=`awk '/'"$MAC_ADDRESS"'/ { print $1 }' $0` #Donne le nom par rapport au programme lancé
  if [ "$NAME_MAC" == "" ]; then
    NAME_MAC="$MAC_ADDRESS"
  fi
fi
}


#Histoire de remplir la liste arp de facon plus rapide qu'une simple boucle for
while [ "$PROCESS_NUMBER" -ne 5 ] || [ "$PROCESS_CURRENT" -lt 10 ] || [ "$PROCESS_CURRENT" -lt "$PROCESS_FINAL" ]; 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
for IP in `seq 1 $PROCESS_FINAL`;do
 get_mac
 if [ "$ALL" == "true" ]; then
   if [ "$NAME_MAC" != "null" ]; then
     echo $IP_PREFIX.$IP $NAME_MAC
   fi
 elif [ "$NAME_MAC" == "$1" ]; then
  echo $IP_PREFIX.$IP
  exit 0		
 fi
done

Re,

Problème avec arp :frowning: Même punition, même motif !

Même solution :smiley:

Et non pas totalement la même solution …

plutot un:

if [ ! -x /usr/sbin/arp ]; then
 echo "Pas les droits nécessaire pour exécuter arp"
 exit 1
fi

Brutal mais efficace :smt003

Sinon faudrait voir du coté de:
cat /proc/net/arp | grep -v 00:00:00:00:00:00

ls -l /proc/net/arp
-r–r--r-- 1 root root 0 déc. 13 14:07 /proc/net/arp

et tout le monde peut le lire en plus :-p