YouNix Posté(e) le 4 avril 2006 Partager Posté(e) le 4 avril 2006 Salut à tous, SVP j'ai un petit probleme avec ce script, il ne veut pas tourner, merci de bien vouloir m'aider: #!/bin/sh if [ -f ram ] then rm ram; fi if [ -f ram2 ] then rm ram2; fi grep "MemTotal" /proc/meminfo > ram2; grep "MemFree" /proc/meminfo >> ram2; grep "Buffers" /proc/meminfo >> ram2; sed "s/[ ][ ]*/:/g" ram2 > ram; sed "s/[:][:]*/:/g" ram > ram2; memTotal=`grep "MemTotal" ram2 | cut -d: -f2 ram2`; memFree=`grep "MemFree" ram2 | cut -d: -f2 ram2`; memBuffers=`grep "Buffers" ram2 | cut -d: -f2 ram2`; memUsed=`expr $memTotal - $memFree`; echo "Ram: $memTotal :Total: $memUsed :Used: $memFree :Free: $Buffers :Buffers" > ram; more ram; et ce en m'indiaquant: linux:/home/HacH # sh ram.sh expr: erreur de syntaxe Ram: 515076 13792 55340 :Total: :Used: 515076 13792 55340 :Free: :Buffers Merci bien de m'aider... PS: desolé je devrait essayer de mettre des capture au lieu ce code mais ca n'a pas voulu marcher. Lien vers le commentaire Partager sur d’autres sites More sharing options...
theocrite Posté(e) le 4 avril 2006 Partager Posté(e) le 4 avril 2006 memUsed=`expr $memTotal - $memFree`; memUsed=$((expr $memTotal - $memFree)) D'ailleurs toujours remplacer les `` par des $() en bash (pour les scripts sh uniquement, il faut s'en tenir aux `). PS: desolé je devrait essayer de mettre des capture au lieu ce code mais ca n'a pas voulu marcher. Non surtout pas .EDIT : Tiens pendant que j'y pense : grep "MemTotal" /proc/meminfo > ram2grep "MemFree" /proc/meminfo >> ram2 grep "Buffers" /proc/meminfo >> ram2 egrep "MemTotal|MemFree|Buffers" /proc/meminfo Plus propre et plus lisible EDIT 2: moi j'aurais fait comme ça : for pattern in MemTotal MemFree Buffers; do echo -e "$pattern :" grep $pattern /proc/meminfo | awk {'print $2'} done Lien vers le commentaire Partager sur d’autres sites More sharing options...
tuXXX Posté(e) le 4 avril 2006 Partager Posté(e) le 4 avril 2006 D'ailleurs toujours remplacer les `` par des $() en bash (pour les scripts sh uniquement, il faut s'en tenir aux `). Avec le sh livré avec bash ça marche aussi, les $( ) memUsed=$((expr $memTotal - $memFree)) Euh non ça ne marche pas ça... Là je vois 3 manières de le faire : memUsed=`expr $memTotal - $memFree` memUsed=$(expr $memTotal - $memFree) memUsed=$(($memTotal - $memFree)) EDIT : pour les warriors : #!/bin/sh eval $(sed -n -r -e 's/^(MemTotal|MemFree|Buffers):\s*([0-9]*).*/\1=\2/g p' /proc/meminfo) echo "Ram: Total:$MemTotal Used:$(($MemTotal-$MemFree)) Free:$MemFree Buffers:$Buffers" Lien vers le commentaire Partager sur d’autres sites More sharing options...
theocrite Posté(e) le 5 avril 2006 Partager Posté(e) le 5 avril 2006 Avec le sh livré avec bash ça marche aussi, les $( ) Si c'est un lien symbolique vers bash (ou dash chez debian), c'est sûr Mais avec un vrai sh, ça ne fonctionne pas. memUsed=$((expr $memTotal - $memFree)) Euh non ça ne marche pas ça... Oui, bien évidemment, il ne faut pas tenir compte du expr qui est resté par erreur. #!/bin/sh eval $(sed -n -r -e 's/^(MemTotal|MemFree|Buffers):\s*([0-9]*).*/\1=\2/g p' /proc/meminfo) echo "Ram: Total:$MemTotal Used:$(($MemTotal-$MemFree)) Free:$MemFree Buffers:$Buffers" Jolie solution. Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 5 avril 2006 Partager Posté(e) le 5 avril 2006 #!/bin/sh eval $(sed -n -r -e 's/^(MemTotal|MemFree|Buffers):\s*([0-9]*).*/\1=\2/g p' /proc/meminfo) echo "Ram: Total:$MemTotal Used:$(($MemTotal-$MemFree)) Free:$MemFree Buffers:$Buffers" Jolie solution. je ne sais pas si on peux qualifier une solution en -wx--x--x de jolie... Lien vers le commentaire Partager sur d’autres sites More sharing options...
tuXXX Posté(e) le 5 avril 2006 Partager Posté(e) le 5 avril 2006 je ne sais pas si on peux qualifier une solution en -wx--x--x de jolie... Euh... Lien vers le commentaire Partager sur d’autres sites More sharing options...
theocrite Posté(e) le 5 avril 2006 Partager Posté(e) le 5 avril 2006 Il a dit que c'est pas très lisible Mais moi je trouve sympa de passer par un remplacement plutôt qu'un grep, c'est bien pensé. Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 5 avril 2006 Partager Posté(e) le 5 avril 2006 c'est surtout plus rapide, non ? une boucle au lieu de trois Lien vers le commentaire Partager sur d’autres sites More sharing options...
YouNix Posté(e) le 6 avril 2006 Auteur Partager Posté(e) le 6 avril 2006 d'abord je vous remercie les gars pour vos apports malgré que j'ai pas encore tester faite de temps, mais bref SVP: for pattern in MemTotal MemFree Buffers; do echo -e "$pattern :" grep $pattern /proc/meminfo | awk {'print $2'} done que fait exactement awk dans ca cas. je ne sais pas si on peux qualifier une solution en -wx--x--x de jolie... ??????pourquoi? Mer6.... Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sandeman Posté(e) le 6 avril 2006 Partager Posté(e) le 6 avril 2006 --wx--w--w c'est le résultat d'un chmod a-r sur un shell normal (en -rwx-rw-rw-) chmod a-r signifiant : enlever l'attribut lisible pour le fichier ... lorinc pour l'astuce sinon on peut aussi utiliser l'output de vmstat, hein Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 6 avril 2006 Partager Posté(e) le 6 avril 2006 d'abord je vous remercie les gars pour vos apports malgré que j'ai pas encore tester faite de temps, mais bref SVP: for pattern in MemTotal MemFree Buffers; do echo -e "$pattern :" grep $pattern /proc/meminfo | awk {'print $2'} done que fait exactement awk dans ca cas. je ne sais pas si on peux qualifier une solution en -wx--x--x de jolie... ??????pourquoi? Mer6.... awk affiche le deuxième argument qui lui a été passé, et comme avec avec le pipe tu lui passes un truc du style "MemTotal 65535 Mo", et bien le deuxième argument est 65535 Lien vers le commentaire Partager sur d’autres sites More sharing options...
theocrite Posté(e) le 6 avril 2006 Partager Posté(e) le 6 avril 2006 Là je vois 3 manières de le faire :memUsed=`expr $memTotal - $memFree` memUsed=$(expr $memTotal - $memFree) memUsed=$(($memTotal - $memFree)) En fait il y a aussi : let memused = "$memTotal - $memFree" ((memused=memTotal-memFree)) Et pour info attention avec eval. Ne *jamais* utiliser eval avec des variables dont on ne contrôle pas l'entrée ! Lien vers le commentaire Partager sur d’autres sites More sharing options...
YouNix Posté(e) le 6 avril 2006 Auteur Partager Posté(e) le 6 avril 2006 Et pour info attention avec eval. Ne *jamais* utiliser eval avec des variables dont on ne contrôle pas l'entrée ! sinon on risque quoi ??? Lien vers le commentaire Partager sur d’autres sites More sharing options...
theocrite Posté(e) le 6 avril 2006 Partager Posté(e) le 6 avril 2006 La grippe aviaire. Plus sérieusement suppose un eval $ma_var qui est remplie par un utilisateur. Ton utilisateur un peu malicieux va mettre dans ma_var une chaine du genre "echo coucou;rm -rf ~" (en supposant que le suid soit sur le script, sinon le home du propriétaire en dur). Résultat en remplaçant, ça va faire eval echo coucou;rm -rf ~ Le eval s'arrête au ; et le reste est traité en tant que shell script. En fait le nom eval vient d'une erreur. L'inventeur d'eval voulait en fait l'appeller evil, mais il a fait une faute de frappe et c'est resté eval. Lien vers le commentaire Partager sur d’autres sites More sharing options...
tuXXX Posté(e) le 7 avril 2006 Partager Posté(e) le 7 avril 2006 Plus sérieusement suppose un eval $ma_var qui est remplie par un utilisateur.Ton utilisateur un peu malicieux va mettre dans ma_var une chaine du genre "echo coucou;rm -rf ~" (en supposant que le suid soit sur le script, sinon le home du propriétaire en dur). Résultat en remplaçant, ça va faire eval echo coucou;rm -rf ~ Le eval s'arrête au ; et le reste est traité en tant que shell script. Même pas... si tu met ma_var="rm -rf ~" ça marche aussi (c'est même fait exprès)... (bon, en passant par sed avant et vu la regex utilisée je pense qu'il n'y a pas trop de risque ) Lien vers le commentaire Partager sur d’autres sites More sharing options...
theocrite Posté(e) le 7 avril 2006 Partager Posté(e) le 7 avril 2006 Ouais c'est vrai en plus. Je pensait à un exemple pratique plus compliqué. Bon pour ici c'est pas trop grave, c'est un fichier qu'on peut truster quand même, c'est pour ça que j'ai précisé une entrée qu'on ne contrôle pas : une variable en paramètre ou un/des fichier (touch "rm -rf *" ou un truc dans le genre). Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.