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/bar
jam tangan/foo/bar
direktori untuk file/direktori apa pun yang mungkin dibuat yaitu perhatikancreate
apa 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 demikianrm
direktori (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