Vous ne pouvez pas, étant donné que l'utilisateur qui crée le répertoire dispose des autorisations suffisantes pour écrire dans le répertoire parent.
Vous pouvez à la place utiliser le inotify
famille d'appels système fournis par le noyau Linux, pour surveiller la création (et éventuellement mv
-ing) du répertoire shop
dans le répertoire donné, s'il a été créé (ou éventuellement mv
-ed), rm
le répertoire.
Le programme d'espace utilisateur dont vous avez besoin dans ce cas est inotifywait
(livré avec inotify-tools
, installez-le d'abord si nécessaire).
En supposant le répertoire shop
résiderait en /foo/bar
répertoire, définissons une surveillance pour /foo/bar/shop
création, et rm
instantanément si créé :
inotifywait -qme create /foo/bar | \
awk '/,ISDIR shop$/ { system("rm -r -- /foo/bar/shop") }'
-
inotifywait -qme create /foo/bar
montres/foo/bar
répertoire pour tout fichier/répertoire qui pourrait être créé, c'est-à-dire surveiller toutcreate
événement -
Si créé,
awk '/,ISDIR shop$/ { system("rm -r -- /foo/bar/shop") }'
vérifie si le fichier se trouve être un répertoire et le nom estshop
(/,ISDIR shop$/
), si ouirm
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 de shop
du répertoire.
Si vous souhaitez surveiller mv
-ing opérations aussi, ajouter watch pour moved_to
événement aussi :
inotifywait -qme create,moved_to /foo/bar | \
awk '/,ISDIR shop$/ { system("rm -r -- /foo/bar/shop") }'
Juste pour noter, si vous cherchez un fichier, pas un répertoire, nommé shop
:
inotifywait -qme create /foo/bar | \
awk '$NF == "shop" { system("rm -- /foo/bar/shop") }'
inotifywait -qme create,moved_to /foo/bar | \
awk '$NF == "shop" { system("rm -- /foo/bar/shop") }'
Pour répondre littéralement en se basant sur la question de la prévention d'un dossier d'un certain nom à créer.
touch shop
Vous ne pouvez pas créer de répertoire si un fichier avec un nom identique existe
mkdir: cannot create directory ‘shop’: File exists
Qu'en est-il du piratage mkdir
appel système avec LD_PRELOAD
... ?
$ ls
test.c
$ cat test.c
#define _GNU_SOURCE
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <dlfcn.h>
typedef int (*orig_mkdir_func_type)(const char *path, mode_t mode);
int mkdir(const char *path, mode_t mode) {
if(!strcmp(path, "shop")) return 1;
orig_mkdir_func_type orig_func;
orig_func = (orig_mkdir_func_type)dlsym(RTLD_NEXT, "mkdir");
return orig_func(path, mode);
}
$ gcc -shared -fPIC test.c -o test.so
$ LD_PRELOAD='./test.so' mkdir test
$ LD_PRELOAD='./test.so' mkdir shop
mkdir: cannot create directory ‘shop’: No such file or directory
$ ls
test test.c test.so
Notez qu'à l'intérieur de ce gestionnaire, vous pouvez enregistrer le PID du processus qui souhaite créer ce répertoire à la place :
$ cat test.c
#define _GNU_SOURCE
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <dlfcn.h>
typedef int (*orig_mkdir_func_type)(const char *path, mode_t mode);
int mkdir(const char *path, mode_t mode) {
if(!strcmp(path, "shop")) {
FILE* fp = fopen("/tmp/log.txt", "w");
fprintf(fp, "PID of evil script: %d\n", (int)getpid());
fclose(fp);
}
orig_mkdir_func_type orig_func;
orig_func = (orig_mkdir_func_type)dlsym(RTLD_NEXT, "mkdir");
return orig_func(path, mode);
}
$ gcc -shared -fPIC test.c -o test.so
$ LD_PRELOAD='./test.so' mkdir shop
$ cat /tmp/log.txt
PID of evil script: 8706
Vous devez placer ceci dans ~/.bashrc
de la racine (ou de la personne qui exécute votre application) pour vous assurer qu'elle sera utilisée :
export LD_PRELOAD=/path/to/test.so