[Précédent (date)] [Suivant (date)] [Précédent (sujet)] [Suivant (sujet)] [Index par date] [Index par sujet]

Re: shell script



Nicolas Couture wrote:

>
>>
>># Extrait les lignes nouvelles de suid vs. suid.old
>>(cat suid suid.old | sort | uniq -u; cat suid) | sort | uniq -d > suid.new
>># sort trie les lignes en ordre (nécessaire pour uniq)
>># uniq -u n'imprime que les lignes uniques
>># uniq -d n'imprime que les lignes dupliquées (une seule fois)
>># cat suid suid.old | sort | uniq -u récupère donc les lignes qui
>>n'appartiennent
>># qu'à un seul des deux fichiers
>># on ajoute ensuite le contenu du nouveau fichier: cat suid
>># L'ensemble de la sortie sera trié et seule les lignes dupliquées
>>(appartenant
>># donc à la fois aux lignes uniques des deux fichiers et à suid
>># seront sélectionnées ( | sort | uniq -d )
>># 'test -s file' vérifie si le fichier a une taille plus grande que zéro.
>>if [ -s suid.new ]; then
>>  echo "proceed suid.new";
>>else
>>  echo "No new suid files found."
>>fi
>>
>>A+
>>Fabien
>>
>
>Le seul probleme c'est que je n'veux pas savoir s'il y a eu des fichiers effaces. Dans ce cas, je n'ai seulement trouve ce que je cherchais avec diff. Ce que je veux vraiment faire c'est de ne voir que la difference avec le nouveau fichier cree et pas le .old.
>
Le problème avec diff, c'est qu'il peut parfois décider de faire un truc 
comme ça:

< fichierA
< fichierB
< fichierC
 > fichier1
 > fichier2
 > fichierB

Comme tu vois, fichierB qui était déjà là, est présenté comme un nouveau 
fichier.
La ligne de commande que je te suggère permet justement de sélectionner 
que les
lignes vraiment nouvelles du fichier suid qui ne sont pas suid.old. 
 Comme expliqué
dans les commentaires, ça se fait en 2 étapes:
1- Sélectionnez les lignes qui sont uniques aux deux fichiers.  C'est le 
rôle
de 'cat suid suid.old | sort | uniq -u'
2- Puis, filtrez toute celle qui sont uniquement dans suid (j'aurais 
aussi bien pu choisir de filtrez que celles qui ne sont PAS dans 
suid.old aussi, c'est la même chose).

>
<snip>
#! /bin/sh
# Copyright 2001, 2002 Nicolas Couture, Rosemere, Quebec, CA
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
# permitted provided that the following conditions are met:
#
# 1. Redistributions of this script must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
#
#  THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 
IMPLIED
#  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
#  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN 
NO
#  EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
#  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 
TO,
#  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
PROFITS;
#  OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
#  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
#  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
#  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#

+ # function  diff à réutiliser partour
+ function getnewlines()
+ {
+     (cat $1 $2 | sort | uniq -u; cat $1) | sort | uniq -d
+ }
+
+ function checkfiles()
+ {
+   filename=$1;
+   if [ "$(getnewlines $filename $filename.old)" = "" ];
+   then
+     echo "No new $filename found.";
+   else
+     echo "New $filename found:"
+     getnewlines $filename $filename.old
+   fi
+  }


# vrfy if user is root before executing this script.
        if [ ! "$UID" = "0" ]; then
            echo "You need to be root to run this script."
            exit 1
        fi


# vrfy and create needed files and directories.
        if [ -r ./md5sum ]; then
                mv ./md5sum ./md5sum.old
        for path in `echo $PATH | tr : '\n'`; do
                for file in $path/*; do
                        md5sum $file > ./md5sum; done;
                                done;
        else if [ ! -r ./md5sum ]; then
                for path in `echo $PATH | tr : '\n'`; do
                        for file in $path/*; do
                                md5sum $file > ./md5sum; done;
                                        done; fi;
                                                fi;

        if [ -r ./suid ]; then
                mv ./suid ./suid.old
                find / \( -perm -004000 -o -perm -002000 \) -type f -print >
../suid; else
                        find / \( -perm -004000 -o -perm -002000 \) -type f 
-print > ./suid ; fi

        if [ -r ./guid ]; then
                mv guid ./guid.old
                find / -group kmem -perm -2000 -print > ./guid; else
                        find / -group kmem -perm -2000 -print > ./guid; fi


<cut everything else and replace with:>

+ checkfiles suid
+ checkfiles guid
+ checkfiles md5sum

<snip>

>
>Voila!
>
>Si tu as une suggestion je suis le premier en vouloir en entendre parler! :)
>
Voilà pour moi aussi... je n'ai pas testé toutefois, j'avoue, il se 
pourrait donc qu'une erreur se soit glissée quelque part, mais bon, si 
c'est le cas, ça te permettra d'étudier le code!

>Merci,
>        Nicolas
>
A+
Fabien