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/bar
relojes/foo/bar
directorio para cualquier archivo/directorio que pueda crearse, es decir, busque cualquiercreate
evento -
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írm
el 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