Non puoi, dato che l'utente che crea la directory ha i permessi sufficienti per scrivere sulla directory padre.
Puoi invece sfruttare il inotify
famiglia di chiamate di sistema fornite dal kernel Linux, per controllare la creazione (e facoltativamente mv
-ing) della directory shop
nella directory data, se creata (o facoltativamente mv
-ed), rm
la cartella.
Il programma in spazio utente di cui hai bisogno in questo caso è inotifywait
(fornito con inotify-tools
, installalo prima se necessario).
Assumendo la directory shop
risiederebbe in /foo/bar
directory, impostiamo un monitoraggio per /foo/bar/shop
creazione e rm
istantaneamente se creato:
inotifywait -qme create /foo/bar | \
awk '/,ISDIR shop$/ { system("rm -r -- /foo/bar/shop") }'
-
inotifywait -qme create /foo/bar
orologi/foo/bar
directory per qualsiasi file/directory che potrebbe essere creata, ad esempio controlla qualsiasicreate
evento -
Se creato,
awk '/,ISDIR shop$/ { system("rm -r -- /foo/bar/shop") }'
controlla se il file è una directory e il nome èshop
(/,ISDIR shop$/
), in caso affermativorm
la cartella (system("rm -r -- /foo/bar/shop")
)
Devi eseguire il comando come utente che dispone dell'autorizzazione di scrittura sulla directory /foo/bar
per la rimozione di shop
dalla directory.
Se vuoi monitorare mv
-ing anche le operazioni, aggiungi watch per moved_to
anche l'evento:
inotifywait -qme create,moved_to /foo/bar | \
awk '/,ISDIR shop$/ { system("rm -r -- /foo/bar/shop") }'
Solo per notare, se stai cercando un file, non una directory, chiamato 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") }'
Per rispondere letteralmente in base alla domanda sulla prevenzione di una cartella di un certo nome da creare.
touch shop
Non puoi creare una directory se esiste un file con lo stesso nome
mkdir: cannot create directory ‘shop’: File exists
Che dire del dirottamento di mkdir
chiamata di 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
Si noti che all'interno di questo gestore è possibile registrare il PID del processo che desidera invece creare questa directory:
$ 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
Devi inserirlo in ~/.bashrc
di root (o chiunque esegua la tua app) per garantire che venga utilizzato:
export LD_PRELOAD=/path/to/test.so