GNU/Linux >> Belajar Linux >  >> Linux

Bisakah saya mencegah pembuatan folder dengan nama tertentu?

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 perhatikan create apa pun acara

  • Jika dibuat, awk '/,ISDIR shop$/ { system("rm -r -- /foo/bar/shop") }' memeriksa apakah file tersebut merupakan direktori dan namanya adalah shop (/,ISDIR shop$/ ), jika demikian rm 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

Linux
  1. Apakah Mungkin Membatasi Perintah Tertentu Agar Tidak Dijalankan Di Direktori?

  2. Panggilan sistem linux mana yang digunakan oleh perintah ls di linux untuk menampilkan nama folder/file?

  3. git clone tanpa folder proyek

  1. Bagaimana saya bisa mengecualikan direktori dari perintah ls

  2. Mengapa folder harus dapat dieksekusi?

  3. Cara unlink (menghapus) hardlink khusus. dibuat untuk folder?

  1. Bagaimana cara menghapus direktori dan folder di Linux?

  2. Bisakah Anda Menghapus Enkripsi / Menghapus Enkripsi Dari Folder Beranda Pengguna??

  3. ls hang untuk direktori tertentu