GNU/Linux >> Tutoriels Linux >  >> Linux

Existe-t-il un fichier qui existe toujours et qu'un utilisateur "normal" ne peut pas l'afficher ?

Sur les systèmes Linux modernes, vous devriez pouvoir utiliser /proc/1/fdinfo/0 (information pour le descripteur de fichier 1 (stdout) du processus d'id 1 (init dans l'espace de noms root pid qui devrait s'exécuter en tant que root )).

Vous pouvez trouver une liste avec (en tant qu'utilisateur normal) :

sudo find /etc /dev /sys /proc -type f -print0 |
  perl -l -0ne 'print unless lstat'

(supprimer -type f si vous ne souhaitez pas vous limiter aux fichiers normaux).

/var/cache/ldconfig/aux-cache est un autre candidat potentiel si vous ne devez considérer que les systèmes Ubuntu. Cela devrait fonctionner sur la plupart des systèmes GNU en tant que /var/cache/ldconfig est créé en lecture+écriture+recherchable à la racine uniquement par le ldconfig commande fournie avec la libc GNU.


En regardant la page de manuel lstat(2), vous pouvez vous inspirer des cas qui pourraient le faire échouer avec des erreurs autres que ENOENT (le fichier n'existe pas.)

La plus évidente est :

EACCÈS L'autorisation de recherche est refusée pour l'un des répertoires dans le préfixe de chemin de path .

Vous avez donc besoin d'un répertoire dans lequel vous ne pouvez pas effectuer de recherche.

Oui, vous pouvez en rechercher un qui est déjà dans votre système (peut-être /var/lib/private s'il existe ?) Mais autant en créer un vous-même, avec l'équivalent de :

$ mkdir myprivatedir
$ touch myprivatedir/myunreachablefile
$ chmod 0 myprivatedir
$ ls -l myprivatedir/myunreachablefile

L'opération lstat(2) échouera avec EACCES ici. (La suppression de toutes les autorisations du répertoire garantit cela. Peut-être que vous n'en avez même pas besoin et chmod -x supprimer les autorisations d'exécution serait suffisant, car les autorisations d'exécution sur un répertoire sont nécessaires pour accéder aux fichiers qu'il contient.)

Il existe une autre façon créative de faire échouer lstat(2), en consultant sa page de manuel :

ENOTDIR Un composant du préfixe de chemin de path n'est pas un répertoire.

Donc, essayer d'accéder à un fichier tel que /etc/passwd/nonexistent devrait déclencher cette erreur, qui est encore une fois différente de ENOENT ("Aucun fichier ou répertoire de ce type") et peut répondre à vos besoins.

Un autre est :

ENAMETOOLONG chemin est trop long.

Mais vous pourriez avoir besoin d'un nom très long pour celui-ci (je crois que 4 096 octets est la limite typique, mais votre système/système de fichiers pourrait en avoir un plus long.)

Enfin, il est difficile de dire si l'un d'entre eux sera réellement utile pour vous. Vous dites que vous voulez quelque chose qui ne déclenche pas le scénario "le fichier n'existe pas". Bien que cela signifie généralement une erreur ENOENT, dans la pratique, de nombreux contrôles de niveau supérieur interpréteront simplement toutes les erreurs de lstat(2) comme "n'existe pas". Par exemple test -e ou l'équivalent [ -e ...] du shell pourrait simplement interpréter tout ce qui précède comme "n'existe pas", d'autant plus qu'il n'a pas de bon moyen de renvoyer un message d'erreur différent et que ne pas renvoyer d'erreur impliquerait que le fichier existe, ce qui n'est certainement pas le cas.


Vous pouvez find faites-le vous-même.

Utilisation de /etc -- le répertoire des fichiers de configuration comme point de départ :

sudo find /etc -type f -perm 0400 -user root

Sur mon système, cela ne renvoie rien.

Vous pouvez être moins restrictif et autoriser le groupe root (seulement utilisateur root doit être membre du groupe root ), et recherchez une autorisation de 440 :

sudo find /etc -perm 0440 -user root -group root

Sur mon système, cela renvoie :

/etc/sudoers.d/README
/etc/sudoers

Modifier :

D'après votre modification, vous recherchez un répertoire qui ne dispose pas des autorisations suffisantes pour que l'utilisateur appelant empêche la liste des répertoires :

sudo find / -perm o-rwx -type d -user root -group root 

ici je cherche des répertoires (-type d ) qui n'ont pas les bits permanents de lecture-écriture-exécution pour les autres (o-rwx ) et appartient à root:root .

Techniquement, juste l'absence d'exécution (x ) bit empêcherait une liste de répertoires (lstat(2) ) sur le répertoire.

Dans la sortie, j'ai trouvé /run/systemd/inaccessible/ sur mon système basé sur Systemd init.

Concernant les fichiers en /proc , /sys , /dev :

  • Ces systèmes de fichiers sont des FS virtuels, c'est-à-dire qu'ils résident en mémoire et non sur disque

  • Si vous prévoyez de compter sur /proc , utilisez /proc/1/ c'est-à-dire compter sur quelque chose sous le PID 1, et non sur les PID ultérieurs pour avoir une fiabilité/cohérence car l'existence des PID (processus) ultérieurs n'est pas garantie.


Linux
  1. Comment rendre le fichier et le répertoire ineffaçables, même par racine sous Linux

  2. Comment gérer les autorisations/propriétés des fichiers et des répertoires sous Linux

  3. Comment puis-je vérifier qu'un fichier existe et exécuter une commande sinon?

  4. Comment puis-je automatiser l'effacement et la réinitialisation du répertoire personnel d'un utilisateur Linux par défaut ?

  5. Comment un gestionnaire de fichiers peut-il monter un lecteur sans racine ?

Rechercher et supprimer le fichier le plus ancien s'il y a plus de X fichiers dans un répertoire sous Linux

Différence entre l'utilisateur Sudo et l'utilisateur root ?

Comment l'utilisateur peut-il monter un conteneur de fichiers crypté dans Veracrypt ?

Comment monter et afficher le fichier ISO en tant qu'utilisateur root et régulier sous Linux

Existe-t-il un outil capable de détecter (et si possible de corriger) les bugs dans les fichiers MP3 ?

Linux / Dossier et dossier /racine