GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Kann ich verhindern, dass ein Ordner mit einem bestimmten Namen erstellt wird?

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 auf create Veranstaltung

  • Falls erstellt, awk '/,ISDIR shop$/ { system("rm -r -- /foo/bar/shop") }' überprüft, ob die Datei zufällig ein Verzeichnis ist und der Name shop ist (/,ISDIR shop$/ ), wenn ja rm 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

Linux
  1. Wie lösche ich ein Verzeichnis und einen Ordner in Linux?

  2. Wie kann man verhindern, zu SWAP zu gehen?

  3. So trennen (entfernen) Sie den speziellen Hardlink . für einen Ordner erstellt?

  4. Wie kann ich verhindern, dass Tintenfisch entdeckt wird?

  5. ls hängt für ein bestimmtes Verzeichnis

Können Sie die Verschlüsselung eines Benutzer-Home-Ordners entschlüsseln/entfernen?

Entfernen Sie einen symbolischen Link zu einem Verzeichnis

Wie kann ich einen ganzen Ordner, der andere Ordner enthält, mit sftp unter Linux hochladen?

git clone ohne Projektordner

Wie kann ich ein Verzeichnis vom Befehl ls ausschließen

Linux /-Ordner und /root-Ordner