GNU/Linux >> Tutoriels Linux >  >> Linux

Trouver des fichiers qu'un utilisateur ne peut pas lire ?

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.
En relation :Linux – Étant donné un hachage de validation git, comment savoir quelle version du noyau le contient ?

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 🙂


Linux
  1. Obtenir tous les fichiers qui ont été modifiés à une date précise ?

  2. Comment trouver tous les fichiers qui ne contiennent pas de chaîne de texte ?

  3. Linux - Un seul utilisateur peut-il avoir plusieurs fichiers Crontab ?

  4. Comment trouver tous les fichiers appartenant à un utilisateur spécifique sous Unix/Linux ?

  5. Recherche de fichiers NON détenus par un utilisateur spécifique

Comment trouver des fichiers sous Linux

Trouver des fichiers volumineux sous Linux

Comment trouver des fichiers texte ne contenant pas de texte sous Linux ?

Comment puis-je lister uniquement les fichiers non vides en utilisant ls ?

Comment puis-je trouver tous les fichiers liés en dur sur un système de fichiers ?

Pourquoi "Autres" peut-il lire les fichiers par défaut dans Ubuntu ?