폴더에 있는 항목의 삭제(생성은 아님)를 방지하는 방법은 무엇입니까?

폴더에 있는 항목의 삭제(생성은 아님)를 방지하는 방법은 무엇입니까?

내 홈 디렉터리의 다른 폴더 내에 생성되는 폴더가 있고 이 폴더의 내용을 분석할 수 있기를 원하지만 문제가 있습니다. 폴더가 생성되면 즉시 삭제됩니다. 그것을 만드는 동일한 프로그램. 폴더를 만들 수는 있지만 삭제하지 못하게 할 수 있는 방법이 있나요? 저는 GNOME 3.18과 함께 Ubuntu GNOME 15.10을 실행하고 있습니다.

답변1

ACL을 사용하더라도 이를 수행할 수 있는 권한 설정은 없지만 다음을 사용하여 프로그램과 경쟁할 수 있습니다 inotifywait.

한 터미널에서 다음을 실행했습니다.

while sleep 0.5; do if mkdir foo/bar; then echo foo; rmdir foo/bar; fi; done

보시다시피 이는 디렉토리를 생성하고 메시지를 에코하며 디렉토리를 제거합니다. 이 모든 작업은 인간의 표준에 따라 매우 빠르게 발생합니다.

그리고 다른 것에서는:

while true
do
    if inotifywait -e create foo
    then
        chmod -w foo
        if [[ -d foo/bar ]]
        then
            break 
        else
            chmod +w foo
        fi
    fi
done

이 명령은 에서 항목이 생성될 때까지 기다린 foo다음 에서 쓰기 권한을 제거하고 foo하위 디렉터리를 포착할 시간이 되었는지 테스트합니다. 그렇지 않은 경우 쓰기 권한을 다시 추가하고 다시 시작합니다.

조금 기다린 후:

foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
foo
rmdir: failed to remove ‘foo/bar’: Permission denied
mkdir: cannot create directory ‘foo/bar’: File exists
mkdir: cannot create directory ‘foo/bar’: File exists
mkdir: cannot create directory ‘foo/bar’: File exists
mkdir: cannot create directory ‘foo/bar’: File exists

이는 다음 사항에 의존합니다.경쟁 조건, 그래서 잡을 수 있는지 여부는 운의 문제입니다.


foo/bar프로그램이 만드는 디렉토리입니다. 이름을 모르는 경우 다른 방법을 시도해 볼 수 있습니다.

  • 디렉터리에 다른 항목이 없는지 확인하여 하위 디렉터리가 생성될 때 foo/비어 있지 않도록 하세요. 비어 있지 않은 디렉토리에 대한 일부 테스트는 다음에서 사용할 수 있습니다.이 U&L 게시물:

    shopt -s nullglob
    if [ -n "$(ls -A foo/)" ]
    then
        break
    

    이것은 충분히 빠르게 작동했습니다.

  • inotifywait의 출력 에서 ​​생성된 디렉터리의 이름을 읽습니다 .

    if dir=$(inotifywait -e create --format '%f' foo)
    then
        chmod -w foo
        if [[ -d foo/$dir ]]
    

    이것은 (아직) 나에게는 효과가 없었습니다. 서브쉘을 생성하는 오버헤드로 인해 매번 다른 루프가 승리할 수 있을 만큼 충분히 느려지는 것 같습니다. API 를 사용하여 C로 코딩하면 inotify작동할 수 있습니다.

관련 정보