element="lab.rar" droit=`ls -la $element | cut -d " " -f1` echo "Droits : "$droit
#!/bin/sh check_droit() { RT=$1 [ "$RT" != "${RT/r/}" ] && printf "lecture " [ "$RT" != "${RT/w/}" ] && printf "ecriture " [ "$RT" != "${RT/x/}" ] && printf "execution " printf "\n" } droit=$( stat -c '%A' file ) droit_prop=${droit:1:3} droit_groupe=${droit:4:3} droit_autre=${droit:7:3} printf "droits du proprietaire : " check_droit $droit_prop printf "droits du groupe : " check_droit $droit_groupe printf "droits des autres : " check_droit $droit_autre
Citation
Frédéric Brugmans
Pourquoi pas ceci :
#!/bin/sh
check_droit()
{
RT=$1
[ "$RT" != "${RT/r/}" ] && printf "lecture
"
[ "$RT" != "${RT/w/}" ] && printf
"ecriture "
[ "$RT" != "${RT/x/}" ] && printf
"execution "
printf "\n"
}
droit=$( stat -c '%A' file )
droit_prop=${droit:1:3}
droit_groupe=${droit:4:3}
droit_autre=${droit:7:3}
printf "droits du proprietaire : "
check_droit $droit_prop
printf "droits du groupe : "
check_droit $droit_groupe
printf "droits des autres : "
check_droit $droit_autre
--
Brugmans Frédéric
Citation
panthere noire
Hello
j'ai donc essayer pas mal de chose ls find stat
etc mai après pas mal de recherche, il me faut
passer par un fichier temporaire , sinon sa va
être trop lourd.
donc l'idée c'est de faire un find / >>
tmp001
ensuite de récupérer chaque chemin fichier et de
lire les droit avec stat et un grep et de mettre
le tout dans un fichier final.
A la limite faire 3 fichier 1 avec l'user le 2 ème
le group, le 3 avec la permission en octal.
seulement le problème c'est que stat ne gère pas
les espaces
donc si quelqu'un a une idée sur le sujet je suis
preneur
Je precise que je débute en script shell
#!/bin/sh # Fonction qui donne les droits en octal d'un groupe de 3 lettres rwx droitOctal() { ....( ........octal=0 ........test "`echo $1 |cut -c1`" = "r" && octal=`expr $octal + 4` ........test "`echo $1 |cut -c2`" = "w" && octal=`expr $octal + 2` ........test "`echo $1 |cut -c3`" = "x" && octal=`expr $octal + 1` ....) ....echo $octal } # Traitement de tous les fichiers find / -exec ls -ld {} \; |while read ligne do ....# Analyse des infos du "ls" ....droits=`echo $ligne |awk '{print $1}'` ....user=`echo $ligne |awk '{print $3}'` ....group=`echo $ligne |awk '{print $4}'` ....nom=`echo $ligne |awk '{print $NF}'` ....# Analyse des droits ....u=`echo $droits |cut -c2-4` ....u=`droitOctal $u` ....g=`echo $droits |cut -c5-7` ....g=`droitOctal $g` ....o=`echo $droits |cut -c8-10` ....o=`droitOctal $o` ....# Ecriture ....echo "$nom:$user:$group:$u$g$o" doneEt sans fichier temporaire. Tout passe par la mémoire
[fr.lang.free.fr]Citation
panthere noire
Je precise que je débute en script shell
Citation
Sve@r
1) Je vais être assez bateau mais en général il n'est pas besoin de restaurer les droits car il n'y a aucune raison de les perdre.
2) Cependant, si ça arrive et que t'as archivé ton dossier avec "tar cvf", tu peux restaurer ton dossier et tous les droits de ses fichiers en tapant "tar xpvf"
3) c'est dommage de faire 3 fichiers là où un seul suffit. Un fichier contenant sur chaque ligne "nom_fichier:user:group:droit". C'est toujours mieux de regrouper ensemble les choses qui vont ensemble. Et c'est pas compliqué de traiter un tel fichier et d'éclater chaque ligne avec "cut"
4) Qu'entends-tu par "stat ne gère pas les espaces" ???
man cutCitation
panthere noire
3.- tout a fait d'accord je ne connaissait pas cut en detail je vai voire mon pote google
Au lieu de faireCitation
panthere noire
4.- il ne parvien pas a obtenire les information
si le fichier contien un espace par exemple monfichier_pouet.txt va marcher , mai pas
monfichier pouet.txt
stat monfichier pouet.txtDemande
stat "monfichier pouet.txt"Et là, t'auras plus de soucis d'espace.
stat "$file"D'ailleurs, si tu regardes attentivement mon script, chaque fois que je m'intéresse à une variable, je la mets toujours entre double guillemets...
#!/bin/sh echo " Vetion 1.4" # Fonction pour avoire les droits en octet droitOctal() { #j'ai supprimer les () pour crée un processus fils car cela ne marchait pas ! octal=0 test "`echo $1 |cut -c2`" = "r" && octal=`expr $octal + 400` test "`echo $1 |cut -c3`" = "w" && octal=`expr $octal + 200` test "`echo $1 |cut -c4`" = "x" && octal=`expr $octal + 100` test "`echo $1 |cut -c5`" = "r" && octal=`expr $octal + 40` test "`echo $1 |cut -c6`" = "w" && octal=`expr $octal + 20` test "`echo $1 |cut -c7`" = "x" && octal=`expr $octal + 10` test "`echo $1 |cut -c8`" = "r" && octal=`expr $octal + 4` test "`echo $1 |cut -c9`" = "w" && octal=`expr $octal + 2` test "`echo $1 |cut -c10`" = "x" && octal=`expr $octal + 1` test "`echo $1 |cut -c4`" = "s" && octal=`expr $octal + 4100` test "`echo $1 |cut -c7`" = "s" && octal=`expr $octal + 6110` test "`echo $1 |cut -c10`" = "t" && octal=`expr $octal + 7001` test "`echo $1 |cut -c4`" = "S" && octal=`expr $octal + 4000` test "`echo $1 |cut -c7`" = "S" && octal=`expr $octal + 6000` test "`echo $1 |cut -c10`" = "T" && octal=`expr $octal + 7000` #echo permet d'avoire un retour de la fonction echo $octal } # listing des fichier find / -exec ls -ld {} \; |while read ligne do # Analyse des infos du "ls" droits=`echo $ligne |awk '{print $1}'` user=`echo $ligne |awk '{print $3}'` group=`echo $ligne |awk '{print $4}'` nom=`echo $ligne |awk '{print $NF}'` o=`echo $droits |cut -c0-10` ret=`droitOctal $o` # Ecriture #j'ai mis d'abort les droit avant le fichier pour des facilité de lecture pour la suite Full="$ret:$user:$group:$droits:$nom" echo $Full echo $Full >> "`pwd`/Desktop/droit000.txt" #on fait une pause pour lire les info #sleep 1 done exit 0
#!/bin/sh analyse() { for name in $(ls $1) ; do stats=$(stat $1/$name | tr '()/' ' ' | awk '/Access.*Uid/ {print $2 ":" $5 ":" $8}') echo "$1/$name:$stats" [ -d $1/$name ] && analyse $1/$name done } analyse $1
#!/bin/sh analyse() { ls -A "$1" | while read name do stats=$(stat "$1/$name" | tr '()/' ' ' | awk '/Access.*Uid/ {print $2 ":" $5 ":" $8}') echo "$1/$name:$stats" [ -d "$1/$name" ] && analyse "$1/$name" done } analyse "$1"
Citation
RTFM stat
#!/bin/sh analyse() { ls -A "$1" | while read name do stat -c '%n:%a:%u:%g' "$1/$name" [ -d "$1/$name" ] && analyse "$1/$name" done } analyse "$1"
find $dossier/ -mindepth 1 -exec stat -c "%a %u:%g {}" {} \; >$restauration
#!/bin/sh echo '#!/bin/sh' >restauration find ${1}/ -exec stat -c "chmod %a {} ; chown %u:%g {}" {} \; | tac >>restauration
J'apprécie beaucoup ton script. Il montre que t'as hyper bien assimiléCitation
panthere noire
Oui Merci )
j'ai dejä un peut modifié le code
#!/bin/sh
echo "VetionVersion 1.4"
# Fonction pour avoireles droits enoctetOCTAL
droitOctal()
{
#j'ai supprimer les () pour crée un processus fils
car cela ne marchait pas !
octal=0
test "`echo $1 |cut -c2`" = "r" &&
octal=`expr $octal + 400`
test "`echo $1 |cut -c3`" = "w" &&
octal=`expr $octal + 200`
test "`echo $1 |cut -c4`" = "x" &&
octal=`expr $octal + 100`
test "`echo $1 |cut -c5`" = "r" &&
octal=`expr $octal + 40`
test "`echo $1 |cut -c6`" = "w" &&
octal=`expr $octal + 20`
test "`echo $1 |cut -c7`" = "x" &&
octal=`expr $octal + 10`
test "`echo $1 |cut -c8`" = "r" &&
octal=`expr $octal + 4`
test "`echo $1 |cut -c9`" = "w" &&
octal=`expr $octal + 2`
test "`echo $1 |cut -c10`" = "x" &&
octal=`expr $octal + 1`
test "`echo $1 |cut -c4`" = "s" &&
octal=`expr $octal + 4100`
test "`echo $1 |cut -c7`" = "s" &&
octal=`expr $octal + 6110`
test "`echo $1 |cut -c10`" = "t" &&
octal=`expr $octal + 7001`
test "`echo $1 |cut -c4`" = "S" &&
octal=`expr $octal + 4000`
test "`echo $1 |cut -c7`" = "S" &&
octal=`expr $octal + 6000`
test "`echo $1 |cut -c10`" = "T" &&
octal=`expr $octal + 7000`
#echo permet d'avoire un retour de la fonction
echo $octal
}
# listing des fichier
find / -exec ls -ld {} \; |while read ligne
do
# Analyse des infos du "ls"
droits=`echo $ligne |awk '{print $1}'`
user=`echo $ligne |awk '{print $3}'`
group=`echo $ligne |awk '{print $4}'`
nom=`echo $ligne |awk '{print $NF}'`
o=`echo $droits |cut -c0-10`
ret=`droitOctal $o`
# Ecriture
#j'ai mis d'abort les droit avant le fichier pour
des facilité de lecture pour la suite
Full="$ret:$user:$group:$droits:$nom"
echo $Full
echo $Full >> "`pwd`/Desktop/droit000.txt"
#on fait une pause pour lire les info
#sleep 1
done
exit 0
Je me demande si il n'y a pas un moyen d'optimiser
le code car c est lent et c'est pas la commande
find qui fait ramer le tout donc je ne voit pas ou
est le problème
peut etre que awk est lent ?
Ceci ce produit meme si j'enleve l'écriture dans
le fichier.
Oui mais là, je crois qu'on est parti dans un délire que seuls ceux qui aiment faire des folies en shell peuvent apprécier...Citation
Mushroom
Je sais pas si je comprends bien le problème, mais il me semble qu'il y a plus simple :
Tiens ? je ne connaissais pas "tac"... mais il y a à peine 2 ans je ne connaissais pas non plus "rev" ni "xargs"...Citation
Mushroom
tac assurant ici que les fichiers les plus en profondeurs seront traités en premier, en inversant la sortie. J'ai rien compris
C'est sure que cela m'aide deja beaucoup quand on a un point de départ, merciCitation
Sve@r
J'apprécie beaucoup ton script. Il montre que t'as hyper bien assimilé
read -a tb <<< $ligne
#!/bin/sh echo " Vesion 1.5" # listing des fichier find / -exec ls -ld {} \; |while read ligne do # Analyse des infos du "ls" read -a tb <<< $ligne #La boucle ici pour s'assurer que le nom et le chemin du fichier #ne son pas tronquée par read si un espace ce trouve dans un nom d'unrepertoire ou un fichier b=7 a=${#tb[*]} while true do if [ $a -ge $b ] then # l'erreur ce situe ici l'orceque il rencontre le / PathFile=$(($PathFile + ${tb[$b]})) echo "ok " $PathFile else echo sortie break fi b=$(($b + 1)) sleep 0.0001 done # la suite doit encore etre modifier octal=0 test "`echo $1 |cut -c2`" = "r" && octal=`expr $octal + 400` test "`echo $1 |cut -c3`" = "w" && octal=`expr $octal + 200` test "`echo $1 |cut -c4`" = "x" && octal=`expr $octal + 100` test "`echo $1 |cut -c5`" = "r" && octal=`expr $octal + 40` test "`echo $1 |cut -c6`" = "w" && octal=`expr $octal + 20` test "`echo $1 |cut -c7`" = "x" && octal=`expr $octal + 10` test "`echo $1 |cut -c8`" = "r" && octal=`expr $octal + 4` test "`echo $1 |cut -c9`" = "w" && octal=`expr $octal + 2` test "`echo $1 |cut -c10`" = "x" && octal=`expr $octal + 1` test "`echo $1 |cut -c4`" = "s" && octal=`expr $octal + 4100` test "`echo $1 |cut -c7`" = "s" && octal=`expr $octal + 6110` test "`echo $1 |cut -c10`" = "t" && octal=`expr $octal + 7001` test "`echo $1 |cut -c4`" = "S" && octal=`expr $octal + 4000` test "`echo $1 |cut -c7`" = "S" && octal=`expr $octal + 6000` test "`echo $1 |cut -c10`" = "T" && octal=`expr $octal + 7000` # Ecriture #j'ai mis d'abort les droit avant le fichier pour des facilité de lecture pour la suite #Full="$ret:$user:$group:$droits:$nom" #echo $Full #echo $Full >> "`pwd`/Desktop/droit000.txt" #on fait une pause pour lire les info #sleep 1 done exit 0
Non, on peut pas.Citation
panthere noire
on peut pas editer ici ??
Citation
panthere noire
bref voila le code , je rencontre un problème de
syntaxe
#!/bin/sh
echo " Vesion 1.5"
# listing des fichier
find / -exec ls -ld {} \; |while read ligne
do
# Analyse des infos du "ls"
read -a tb <<< $ligne
#La boucle ici pour s'assurer que le nom et le
chemin du fichier
#ne son pas tronquée par read si un espace ce
trouve dans un nom d'unrepertoire ou un fichier
b=7
a=${#tb[*]}
while true
do
if [ $a -ge $b ]
then
# l'erreur ce situe ici l'orceque il rencontre le
/
PathFile=$(($PathFile + ${tb[$b]}))
echo "ok " $PathFile
else
echo sortie
break
fi
b=$(($b + 1))
sleep 0.0001
done
# la suite doit encore etre modifier
octal=0
test "`echo $1 |cut -c2`" = "r" &&
octal=`expr $octal + 400`
test "`echo $1 |cut -c3`" = "w" &&
octal=`expr $octal + 200`
test "`echo $1 |cut -c4`" = "x" &&
octal=`expr $octal + 100`
test "`echo $1 |cut -c5`" = "r" &&
octal=`expr $octal + 40`
test "`echo $1 |cut -c6`" = "w" &&
octal=`expr $octal + 20`
test "`echo $1 |cut -c7`" = "x" &&
octal=`expr $octal + 10`
test "`echo $1 |cut -c8`" = "r" &&
octal=`expr $octal + 4`
test "`echo $1 |cut -c9`" = "w" &&
octal=`expr $octal + 2`
test "`echo $1 |cut -c10`" = "x" &&
octal=`expr $octal + 1`
test "`echo $1 |cut -c4`" = "s" &&
octal=`expr $octal + 4100`
test "`echo $1 |cut -c7`" = "s" &&
octal=`expr $octal + 6110`
test "`echo $1 |cut -c10`" = "t" &&
octal=`expr $octal + 7001`
test "`echo $1 |cut -c4`" = "S" &&
octal=`expr $octal + 4000`
test "`echo $1 |cut -c7`" = "S" &&
octal=`expr $octal + 6000`
test "`echo $1 |cut -c10`" = "T" &&
octal=`expr $octal + 7000`
# Ecriture
#j'ai mis d'abort les droit avant le fichier pour
des facilité de lecture pour la suite
#Full="$ret:$user:$group:$droits:$nom"
#echo $Full
#echo $Full >> "`pwd`/Desktop/droit000.txt"
#on fait une pause pour lire les info
#sleep 1
done
exit 0
Citation
Sve@r
Bon, à vue d'oeuil ton code a l'air correct. Sauf que je ne connais pas la triple redirection "<<<" (ciel ? Il y a donc un truc en shell que je ne connais pas ???)
Citation
Sve@r
t'as pas encore intégré le fait que le setgid donne le droit "2010" et non "6110". Si tu mets "6110" cela veut dire que les droits sont "--s--s---". Comment peux-tu affirmer que le setgid prouve aussi la présence du setuid ??? [/quote
dans le code il y a ecrit : # la suite doit encore etre modifier ;-) en gros je vai virifié mai avant il me faut le code ou je coince.
Citation
Sve@r
">`pwd`/Desktop/..." peut se remplacer par ">Desktop/..." puisqu'un nom ne commençant pas par "/" est automatiquement pris dans "pwd" par défaut...
c'est noter Merci
#pour tester p="/sdf1/sdf2/sdf3 /dsf4" PathFile=$(($PathFile + $p)) echo $PathFile
Citation
panthere noire
Petite précision bon l'erreur c'est le code
suivant qui coince
#pour tester
p="/sdf1/sdf2/sdf3 /dsf4"
PathFile=$(($PathFile + $p))
echo $PathFile
ceci a cause des /
PathFile=$PathFile$p