Je veux trouver des fichiers qu'un utilisateur particulier ne pourra pas lire.
Supposons que le nom d'utilisateur est "user123" et qu'ils appartiennent à un groupe appelé "user123". Je veux trouver des fichiers qui, s'ils appartiennent à user123, ont u+r activé ; à défaut, si le fichier appartient au groupe user123, il doit avoir g+r activé ; à défaut il peut avoir o+r activé.
Puisque GNU find a "-readable", je pourrais faire ceci :
sudo -u user123 find /start ! -readable -ls
Cependant, le processus doit être exécuté par un utilisateur qui n'a pas d'accès sudo. Par conséquent, j'ai essayé ceci :(il ne vérifie pas o+r mais ce n'est pas important à ce stade)
find /start ( -user user123 ! -perm -u=r ) -o ( -group user123 ! -perm -g=r ) -ls
mais il liste ce fichier :
272118 4 -rw------- 1 user123 user123 3243 Jul 3 19:50 /start/blah/blah/file.txt
Ce fichier est le seul fichier sous /start
qui appartient à user123 avec g=r
désactivé. C'est comme si find interprétait le -u=r
comme -g=r
.
J'ai décidé d'essayer d'inverser la logique et de tester à la place not ( truth )
à la place :
find /etc/puppet ! ( ( -user puppet -perm -u=r ) -o ( -group puppet -perm -g=r ) -o ( -perm -o=r ) ) -ls
Ça marche !
Pourquoi le find
d'origine échouer? Est-ce un bogue dans find
(peu probable) ou la logique est-elle erronée ?
Mise à jour : J'ai eu une mauvaise logique. Comme indiqué ci-dessous, puisque
! ( A || B || C ) ==( !A &&!B &&!C )
voici les deux déclarations équivalentes :
find /start ! ( ( -user user123 -perm -u=r ) -o ( -group user123 -perm -g=r ) -o ( ! ( -user user123 -o -group user123 ) -perm -o=r ) ) -ls
find /start ! ( -user user123 -perm -u=r ) ! ( -group user123 -perm -g=r ) ! ( ! ( -user user123 -o -group user123 ) -perm -o=r ) -ls
Mon objectif était de ne pas avoir à tester l'utilisateur/groupe deux fois. Ce dont j'ai vraiment besoin, c'est d'une structure if-then-else plus compliquée, qui ne serait probablement possible que s'il y avait un opérateur -xor. Je pourrais construire un xor à partir de et/ou/non mais ce serait plus complexe que les deux solutions ci-dessus.
Réponse acceptée :
La logique est fausse. Vous pensez que ce fichier n'aurait pas dû être répertorié car il appartient à user123
et a le r
de l'utilisateur jeu de bits. Cependant, il est répertorié car il correspond au deuxième critère (il appartient au groupe user123
et a le r
du groupe peu non défini).
Votre deuxième version fonctionne grâce à l'une des lois de de Morgan :la négation du OU logique d'un groupe d'instructions équivaut logiquement à la négation par un ET de la négation des déclarations individuelles. En d'autres termes :
! ( A || B || C ) == ( !A && !B && !C )
Ainsi, le travail find
recherche un fichier qui
- N'est pas (appartenant à l'utilisateur
user123
et lisible par ledit utilisateur) ET - N'est pas (appartenant au groupe
user123
et lisible par ledit groupe) ET - N'est pas lisible par tous.
tandis que le premier find
recherche un fichier qui
- Appartient à l'utilisateur
user123
et non lisible par ledit utilisateur OU - Appartient au groupe
user123
et non lisible par ledit groupe OU (si vous l'aviez complété) - N'est pas lisible par tous
Ainsi, un fichier correspondant à N'IMPORTE QUEL des 3 critères ci-dessus (et pas nécessairement tous) serait répertorié comme vous l'avez vu.
Modifier
D'ailleurs (après avoir consulté votre profil), je suis un grand fan de votre livre O'Reilly 🙂