Nemůžete, protože uživatel vytvářející adresář má dostatečná oprávnění k zápisu do nadřazeného adresáře.
Místo toho můžete využít inotify
rodina systémových volání poskytovaných linuxovým jádrem pro sledování vytvoření (a volitelně mv
-ing) adresáře shop
v daném adresáři, pokud je vytvořen (nebo volitelně mv
-ed), rm
adresář.
Program uživatelského prostoru, který v tomto případě potřebujete, je inotifywait
(dodává se s inotify-tools
, v případě potřeby jej nejprve nainstalujte).
Za předpokladu, že adresář shop
by sídlil v /foo/bar
adresář, nastavíme monitorování pro /foo/bar/shop
vytvoření a rm
okamžitě, pokud je vytvořen:
inotifywait -qme create /foo/bar | \
awk '/,ISDIR shop$/ { system("rm -r -- /foo/bar/shop") }'
-
inotifywait -qme create /foo/bar
hodinky/foo/bar
adresář pro jakýkoli soubor/adresář, který by mohl být vytvořen, tj. sledujte jakýkolicreate
událost -
Pokud je vytvořen,
awk '/,ISDIR shop$/ { system("rm -r -- /foo/bar/shop") }'
zkontroluje, zda je soubor náhodou adresář a název jeshop
(/,ISDIR shop$/
), pokud anorm
adresář (system("rm -r -- /foo/bar/shop")
)
Musíte spustit příkaz jako uživatel, který má oprávnění k zápisu do adresáře /foo/bar
pro odstranění shop
z adresáře.
Pokud chcete monitorovat mv
-i operace, přidejte hodinky pro moved_to
událost také:
inotifywait -qme create,moved_to /foo/bar | \
awk '/,ISDIR shop$/ { system("rm -r -- /foo/bar/shop") }'
Jen pro poznámku, pokud hledáte soubor, nikoli adresář, pojmenovaný 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") }'
Odpovědět doslova na základě otázky zamezení složky určitého jména, které má být vytvořeno.
touch shop
Nemůžete vytvořit adresář, pokud existuje soubor se stejným názvem
mkdir: cannot create directory ‘shop’: File exists
A co únos mkdir
syscall s 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
Všimněte si, že uvnitř tohoto handleru můžete místo toho přihlásit PID procesu, který chce vytvořit tento adresář:
$ 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
Musíte to umístit do ~/.bashrc
root (nebo kdokoli, kdo spouští vaši aplikaci), aby bylo zajištěno, že bude použita:
export LD_PRELOAD=/path/to/test.so