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/barUhren/foo/barVerzeichnis für alle Dateien/Verzeichnisse, die erstellt werden könnten, d. h. achten Sie aufcreateVeranstaltung -
Falls erstellt,
awk '/,ISDIR shop$/ { system("rm -r -- /foo/bar/shop") }'überprüft, ob die Datei zufällig ein Verzeichnis ist und der Nameshopist (/,ISDIR shop$/), wenn jarmdas 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