No puede, dado que el usuario que crea el directorio tiene suficientes permisos para escribir en el directorio principal.
En su lugar, puede aprovechar el inotify familia de llamadas al sistema proporcionadas por el kernel de Linux, para observar la creación (y opcionalmente mv -ing) del directorio shop en el directorio dado, si se crea (u opcionalmente mv -ed), rm el directorio.
El programa de espacio de usuario que necesita en este caso es inotifywait (viene con inotify-tools , instálelo primero si es necesario).
Asumiendo el directorio shop residiría en /foo/bar directorio, configuremos un monitoreo para /foo/bar/shop creación, y rm instantáneamente si se crea:
inotifywait -qme create /foo/bar | \
awk '/,ISDIR shop$/ { system("rm -r -- /foo/bar/shop") }'
-
inotifywait -qme create /foo/barrelojes/foo/bardirectorio para cualquier archivo/directorio que pueda crearse, es decir, busque cualquiercreateevento -
Si se crea,
awk '/,ISDIR shop$/ { system("rm -r -- /foo/bar/shop") }'comprueba si el archivo es un directorio y el nombre esshop(/,ISDIR shop$/), si es asírmel directorio (system("rm -r -- /foo/bar/shop"))
Debe ejecutar el comando como un usuario que tiene permiso de escritura en el directorio /foo/bar para la eliminación de shop del directorio.
Si desea monitorear mv Operaciones -ing también, agregue reloj para moved_to evento también:
inotifywait -qme create,moved_to /foo/bar | \
awk '/,ISDIR shop$/ { system("rm -r -- /foo/bar/shop") }'
Solo para tener en cuenta, si está buscando un archivo, no un directorio, llamado 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") }'
Para responder literalmente basado en la pregunta de prevenir una carpeta de un cierto nombre a ser creado.
touch shop
No puede crear un directorio si existe un archivo con un nombre idéntico
mkdir: cannot create directory ‘shop’: File exists
¿Qué pasa con el secuestro de mkdir? llamada al sistema con 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
Tenga en cuenta que dentro de este controlador puede registrar el PID del proceso que desea crear este directorio en su lugar:
$ 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
Debe colocar esto en ~/.bashrc de root (o quienquiera que esté ejecutando su aplicación) para asegurarse de que se usará:
export LD_PRELOAD=/path/to/test.so