특정 이름의 폴더가 생성되지 않도록 할 수 있나요?

특정 이름의 폴더가 생성되지 않도록 할 수 있나요?

저는 LAMP 웹 응용 프로그램을 개발 중이며 어딘가에 shop사이트 루트에라는 폴더를 계속 생성하는 예약된 프로세스가 있습니다. 이런 일이 발생할 때마다 애플리케이션의 다시 쓰기 규칙과 충돌이 발생하는데 이는 좋지 않습니다.

문제의 스크립트를 찾을 때까지 shop루트 디렉터리에 이라는 폴더가 생성되지 않도록 하는 방법이 있습니까? 내용이 변경되지 않도록 폴더에 대한 권한을 변경할 수 있다는 것을 알고 있지만 특정 이름의 폴더가 생성되는 것을 방지하는 방법을 찾지 못했습니다.

답변1

디렉터리를 생성한 사용자에게는 상위 디렉터리에 쓸 수 있는 충분한 권한이 있으므로 그렇게 할 수 없습니다.

inotify대신, Linux 커널에서 제공하는 일련의 시스템 호출을 활용하여 mv디렉토리가 이미 생성된 경우(또는 선택적으로 -ed) 지정된 디렉토리에서 디렉토리 생성(및 선택적으로 -ing)을 모니터링할 수 있습니다.shopmvrm

이 경우 필요한 사용자 공간 프로그램은 inotifywait(함께 제공됩니다. inotify-tools필요한 경우 먼저 설치하십시오).


디렉터리가 디렉터리 내부에 shop있다고 가정하고 생성 감시를 /foo/bar설정 하고 생성 직후 이를 살펴보겠습니다./foo/bar/shoprm

inotifywait -qme create /foo/bar | \
             awk '/,ISDIR shop$/ { system("rm -r -- /foo/bar/shop") }'
  • inotifywait -qme create /foo/bar/foo/bar생성될 수 있는 모든 파일/디렉토리에 대한 디렉터리를 감시합니다 . 즉, 모든 create이벤트를 감시합니다.

  • 생성되었다면 해당 파일이 ( ) awk '/,ISDIR shop$/ { system("rm -r -- /foo/bar/shop") }'라는 이름의 디렉터리인지 확인하고 , 그렇다면 해당 디렉터리( )를 확인한다.shop/,ISDIR shop$/rmsystem("rm -r -- /foo/bar/shop")

디렉토리에서 삭제하려면 디렉토리에 대한 쓰기 권한이 있는 사용자로 명령을 실행해야 합니다 /foo/bar.shop


-ing 작업도 모니터링하려면 mv이벤트 모니터링도 추가하세요 moved_to.

inotifywait -qme create,moved_to /foo/bar | \
             awk '/,ISDIR shop$/ { system("rm -r -- /foo/bar/shop") }'

디렉토리 대신 이름이 지정된 파일을 찾는 경우 다음을 참고하세요 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") }'

답변2

예방 질문에 문자 그대로 답하세요폴더생성할 특정 이름입니다.

touch shop

같은 이름의 파일이 있으면 디렉터리를 만들 수 없습니다.

mkdir: cannot create directory ‘shop’: File exists

답변3

mkdir다음을 사용하여 시스템 호출을 하이재킹하는 것은 어떻습니까... 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

이 핸들러에서는 이 디렉터리를 생성하려는 프로세스의 PID를 기록할 수 있습니다.

$ 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

~/.bashrc사용되도록 하려면 루트 디렉터리(또는 애플리케이션을 실행하는 사람) 에 배치해야 합니다 .

export LD_PRELOAD=/path/to/test.so

답변4

존재하지 않는 디렉토리의 존재하지 않는 위치에 대한 심볼릭 링크를 만듭니다. 여기에는 몇 가지 흥미로운 의미가 있습니다.

$ ln -s non-existent/foobar foo
$ ls -ln
total 0
lrwxrwxrwx 1 1000 1000 19 Okt  4 17:17 foo -> non-existent/foobar
$ mkdir foo
mkdir: cannot create directory ‘foo’: File exists
$ cat foo
cat: foo: No such file or directory
$ echo foo > foo
zsh: no such file or directory: foo
  1. EEXISTmkdir, 링크 및 기타 파일은 (파일이 있음) 오류로 인해 실패합니다 .
  2. 읽기, 쓰기 또는 추가를 위해 경로를 열려고 하면 실패합니다 ENOENT(해당 파일이나 디렉터리 없음).
  3. 해당 위치에서 stat(2)(lstat(2) 또는 stat(1)이 아님)을 사용하면 ENOENTlstat도 실패합니다. 물론 심볼릭 링크에 대한 정보가 반환됩니다.

여기에 제안된 다른 솔루션에 비해 두 가지 장점이 있습니다. (a) 디렉터리 생성을 추적하는 서비스를 실행할 필요가 없습니다. (b) 대부분의 명령에 이름이 존재하지 않는 것 같습니다.

시도해 보아야 할 것입니다. 그러나 재작성 규칙이 무엇이든 lstat 또는 기타 비참조 명령을 사용하지 않아 실패하게 되는 것으로 의심됩니다.

관련 정보