Anda tidak bisa, karena pengguna yang membuat direktori memiliki izin yang memadai untuk menulis di direktori induk.
Sebagai gantinya, Anda dapat memanfaatkan inotify keluarga panggilan sistem yang disediakan oleh kernel Linux, untuk mengawasi pembuatan (dan opsional mv -ing) dari direktori shop di direktori yang diberikan, jika dibuat (atau opsional mv -ed), rm direktori.
Program ruang pengguna yang Anda perlukan dalam hal ini adalah inotifywait (dilengkapi dengan inotify-tools , instal terlebih dahulu jika diperlukan).
Dengan asumsi direktori shop akan berada di /foo/bar direktori, mari atur pemantauan untuk /foo/bar/shop kreasi, dan rm langsung jika dibuat:
inotifywait -qme create /foo/bar | \
awk '/,ISDIR shop$/ { system("rm -r -- /foo/bar/shop") }'
-
inotifywait -qme create /foo/barjam tangan/foo/bardirektori untuk file/direktori apa pun yang mungkin dibuat yaitu perhatikancreateapa pun acara -
Jika dibuat,
awk '/,ISDIR shop$/ { system("rm -r -- /foo/bar/shop") }'memeriksa apakah file tersebut merupakan direktori dan namanya adalahshop(/,ISDIR shop$/), jika demikianrmdirektori (system("rm -r -- /foo/bar/shop"))
Anda perlu menjalankan perintah sebagai pengguna yang memiliki izin menulis di direktori /foo/bar untuk menghapus shop dari direktori.
Jika Anda ingin memantau mv -operasi juga, tambahkan jam tangan untuk moved_to acara juga:
inotifywait -qme create,moved_to /foo/bar | \
awk '/,ISDIR shop$/ { system("rm -r -- /foo/bar/shop") }'
Sebagai catatan, jika Anda mencari file, bukan direktori, beri nama 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") }'
Untuk menjawab secara harfiah berdasarkan pertanyaan mencegah folder dari nama tertentu yang akan dibuat.
touch shop
Anda tidak dapat membuat direktori jika ada file dengan nama yang sama
mkdir: cannot create directory ‘shop’: File exists
Bagaimana dengan membajak mkdir syscall dengan 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
Perhatikan bahwa di dalam penangan ini Anda dapat mencatat PID dari proses yang ingin membuat direktori ini sebagai gantinya:
$ 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
Anda harus menempatkannya di ~/.bashrc root (atau siapa pun yang menjalankan aplikasi Anda) untuk memastikan ini akan digunakan:
export LD_PRELOAD=/path/to/test.so