[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 dessusn’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
[/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.
[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é.
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
1 - Rappeler comment rendre ifconfig exécutable par le commun des mortels 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 …
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.
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
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
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
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
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
#!/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