Das ist nicht möglich, vorausgesetzt, der Benutzer, der das Verzeichnis erstellt, hat ausreichende Berechtigungen zum Schreiben in das übergeordnete Verzeichnis.
Sie können stattdessen den inotify
nutzen Familie von Systemaufrufen, die vom Linux-Kernel bereitgestellt werden, um die Erstellung zu überwachen (und optional mv
-ing) des Verzeichnisses shop
im angegebenen Verzeichnis, falls erstellt (oder optional mv
-ed), rm
das Verzeichnis.
Das Userspace-Programm, das Sie in diesem Fall benötigen, ist inotifywait
(kommt mit inotify-tools
, installieren Sie es bei Bedarf zuerst).
Angenommen das Verzeichnis shop
in /foo/bar
wohnen würde Verzeichnis, legen wir eine Überwachung für /foo/bar/shop
fest Erstellung und rm
sofort, wenn erstellt:
inotifywait -qme create /foo/bar | \
awk '/,ISDIR shop$/ { system("rm -r -- /foo/bar/shop") }'
-
inotifywait -qme create /foo/bar
Uhren/foo/bar
Verzeichnis für alle Dateien/Verzeichnisse, die erstellt werden könnten, d. h. achten Sie aufcreate
Veranstaltung -
Falls erstellt,
awk '/,ISDIR shop$/ { system("rm -r -- /foo/bar/shop") }'
überprüft, ob die Datei zufällig ein Verzeichnis ist und der Nameshop
ist (/,ISDIR shop$/
), wenn jarm
das Verzeichnis (system("rm -r -- /foo/bar/shop")
)
Sie müssen den Befehl als Benutzer ausführen, der Schreibrechte für das Verzeichnis /foo/bar
hat zum Entfernen von shop
aus dem Verzeichnis.
Wenn Sie mv
überwachen möchten -ing-Operationen auch, fügen Sie Überwachung für moved_to
hinzu Ereignis auch:
inotifywait -qme create,moved_to /foo/bar | \
awk '/,ISDIR shop$/ { system("rm -r -- /foo/bar/shop") }'
Nur zu beachten, wenn Sie nach einer Datei und nicht nach einem Verzeichnis mit dem Namen shop
suchen :
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") }'
Wörtlich zu beantworten anhand der Frage nach der Verhinderung eines Ordners eines bestimmten Namens erstellt werden.
touch shop
Sie können kein Verzeichnis erstellen, wenn eine Datei mit demselben Namen vorhanden ist
mkdir: cannot create directory ‘shop’: File exists
Was ist mit der Entführung von mkdir
? Systemaufruf mit 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
Beachten Sie, dass Sie in diesem Handler stattdessen die PID des Prozesses protokollieren können, der dieses Verzeichnis erstellen möchte:
$ 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
Sie müssen dies in ~/.bashrc
platzieren von root (oder wer auch immer Ihre App ausführt), um sicherzustellen, dass dies verwendet wird:
export LD_PRELOAD=/path/to/test.so