Je travaille sur une application Web LAMP et il y a un processus planifié quelque part qui continue de créer un dossier appelé shop
à la racine du site. Chaque fois que cela apparaît, cela provoque des conflits avec les règles de réécriture dans l'application, ce n'est pas bon.
Jusqu'à ce que je trouve le script incriminé, existe-t-il un moyen d'empêcher la shop
création d' un dossier appelé à la racine? Je sais que je peux modifier les autorisations sur un dossier pour empêcher la modification de son contenu, mais je n'ai pas trouvé de moyen d'empêcher la création d'un dossier d'un certain nom.
Réponses:
Vous ne pouvez pas, étant donné que l'utilisateur qui crée le répertoire dispose des autorisations suffisantes pour écrire sur le répertoire parent.
Vous pouvez à la place tirer parti de la
inotify
famille d'appels système fournis par le noyau Linux, pour surveiller la création (et éventuellement lemv
-ing) du répertoireshop
dans le répertoire donné, s'il est créé (ou éventuellementmv
-ed),rm
le répertoire.Le programme d'espace utilisateur dont vous avez besoin dans ce cas est
inotifywait
(livré avecinotify-tools
, installez-le d'abord si nécessaire).En supposant que le répertoire
shop
résiderait dans le/foo/bar
répertoire, définissons une surveillance pour la/foo/bar/shop
création etrm
instantanément s'il est créé:inotifywait -qme create /foo/bar
surveille le/foo/bar
répertoire pour tout fichier / répertoire qui pourrait être créé, c'est-à-dire surveillez toutcreate
événementS'il est créé,
awk '/,ISDIR shop$/ { system("rm -r -- /foo/bar/shop") }'
vérifie si le fichier se trouve être un répertoire et que le nom estshop
(/,ISDIR shop$/
), si c'estrm
le répertoire (system("rm -r -- /foo/bar/shop")
)Vous devez exécuter la commande en tant qu'utilisateur disposant d'une autorisation d'écriture sur le répertoire
/foo/bar
pour la suppression dushop
répertoire.Si vous souhaitez également surveiller les
mv
opérations de contrôle , ajoutez également la fonction de surveillance desmoved_to
événements:Juste pour noter, si vous cherchez un fichier, pas un répertoire, nommé
shop
:la source
inotifywait
pour ce faire, il est également possible que le déclencheur puisse également intercepter le processus avecps -ef
Répondre littéralement à la question d'empêcher la création d' un dossier d'un certain nom.
touch shop
Vous ne pouvez pas créer un répertoire si un fichier avec un nom identique existe
mkdir: cannot create directory ‘shop’: File exists
la source
chattr +i shop
pour le rendre immuable. Tant que le drapeau immuable n'est pas supprimé, il ne peut même pas être renommé / supprimé.rename(2)
à continuer à travailler, car le nom ne fait pas partie de l'inode, mais ce n'est pas le cas. Une recherche rapide sur Internet ne révèle pas pourquoi. Des indices?rename
de travailler.Qu'en est-il du détournement de
mkdir
syscall avecLD_PRELOAD
...?Notez qu'à l'intérieur de ce gestionnaire, vous pouvez enregistrer le PID du processus qui souhaite créer ce répertoire à la place:
Vous devez le placer dans
~/.bashrc
root (ou celui qui exécute votre application) pour vous assurer qu'il sera utilisé:la source
LD_PRELOAD
Les hacks comme celui-ci sont fondamentalement toujours faux, et à moins que vous ne sachiez ce que vous faites, ils peuvent gravement casser le programme dans lequel vous les chargez en cassant des propriétés comme la sécurité du signal asynchrone de la fonction que vous remplacez.fopen
devrait avoir à la"a"
place de"w"
, afin qu'il puisse conserver les journaux précédents(Aurait commenté la réponse de Miati mais ne se souvient pas de mon ancien compte et n'a pas assez de réputation sur ce nouveau ...)
Vous pouvez bloquer la création en créant un fichier, puis en modifiant les attributs du fichier.
Ensuite, toute tentative de faire quoi que ce soit avec ce fichier sera bloquée - même si l'utilisateur devient root.
la source
Créez un lien symbolique pointant vers un emplacement inexistant dans un répertoire inexistant. Cela a des implications amusantes:
EEXIST
(le fichier existe).ENOENT
(Aucun fichier ou répertoire de ce type)ENOENT
. lstat renverra bien sûr les informations sur le lien symbolique.Cela présente deux avantages par rapport à certaines des autres solutions proposées ici: (a) vous n'avez pas besoin d'un service en cours d'exécution qui suit la création du répertoire et (b) le nom semble être inexistant pour la plupart des commandes.
Vous devrez essayer, mais je soupçonne que quelles que soient les règles de réécriture que vous avez, ils n'utilisent pas lstat ou d'autres commandes sans déréférencement, ce qui les fait échouer.
la source