Linux에서 inotifywait를 사용한 해결 방법:

Linux에서 inotifywait를 사용한 해결 방법:

Samba 공유에는 모든 사람이 파일을 생성하고 편집하고 삭제할 수 있는 TO 폴더가 있어야 합니다. 그러나 한 사용자가 다른 사용자가 만든 파일을 읽도록 허용해서는 안 됩니다.

주요 아이디어는 학생들이 시험을 제출하고 다른 반 친구들이 쓴 내용을 읽을 수 없는 폴더를 만드는 것입니다. 불필요한 제한이 없어야 합니다. 학생들은 디렉터리를 만들고 파일을 복사할 수 있어야 합니다. 서로 분리되어 있어야 하며, 다른 사람의 파일을 읽거나 삭제해서는 안 됩니다.

Windows에서 이러한 폴더에는 다음과 유사한 ACL이 있습니다.

$ icacls TO
.\TO Everybody: (CI)(Rc,S,RD,WD,AD,X)

교사/소유자는 모든 데이터를 수집하기 위해 해당 폴더에 대한 수정 권한을 갖습니다.

ACL(setfacl, getfacl)을 사용하거나 ACL 없이 표준 Linux 권한만 사용하여 Linux에서 유사한 것을 복제하려면 어떻게 해야 합니까?

답변1

나는 내 자신의 질문에 답할 것입니다. 누군가 이 답변을 개선할 수 있거나 몇 가지 질문이 있는 경우 반드시 그렇게 하십시오. 이 특별한 문제는 지금 꽤 오랫동안 나를 괴롭혔습니다.

내가 요청한 것은 다음에 따르면 POSIX ACL에서는 가능하지 않은 것 같습니다. ACL을 사용하는 디렉터리에서만 그룹+rx 권한ACL은 상속된 권한을 적용할 때 파일과 폴더를 구분할 수 없기 때문입니다.

추가로 두 가지 가능한 해결 방법이 언급되었습니다.

  • inotify (여기서 사용함)
  • binfs (누군가 이것을 시도하면 게시해 주세요)

Linux에서 inotifywait를 사용한 해결 방법:

폴더 권한

루트로서 다음을 수행합니다.

공유할 폴더를 만듭니다.

mkdir fld

최상위 폴더 그룹을 교사 그룹으로 만듭니다. 그룹이 존재해야 하며 교사 기본 그룹이어야 합니다.

chown :teach fld

그룹이 모든 파일/하위 폴더에 상속되도록 합니다. 이는 교사가 읽고, 쓰고, 삭제할 수 있어야 함을 의미합니다.

chmod g+s fld 

다른 사람이 파일을 덮어쓰거나 삭제하는 것을 허용하지 않습니다(예: /tmp 권한)

chmod +t fld

이제 ACL은 이 폴더에 생성된 모든 파일/하위 폴더에 대한 최소 권한을 상속하도록 설정됩니다.

setfacl -m u::rwx,g::rwx,o::rwx,d:u::rwx,d:o::--- fld

이제 학생이 생성한 모든 하위 폴더/파일을 포함해야 하는 최상위 폴더는 다음과 같습니다.

getfacl fld

# file: fld
# owner: root
# group: teach
# flags: -st
user::rwx
group::rwx
other::rwx
default:user::rwx
default:group::rwx
default:other::---

이러한 권한만으로도 어느 정도 장점이 있습니다. 아래에 나오는 스크립트가 실행되지 않으면 위 폴더 권한을 통해 학생들은 자신의 파일을 생성/읽기//편집/삭제할 수 있으며 다른 사람의 파일에는 해당 작업을 수행할 수 없습니다. 폴더는 정상적으로 작동해야 합니다. 즉, 모든 파일을 보거나 나열할 수 있어야 합니다. 유일한 제한은 하위 폴더가 아닌 이 폴더에서만 직접 작동한다는 것입니다. 이는 학생들이 여러 파일을 간단하게 제출하는 데 충분합니다.

학생이 만든 모든 하위 폴더에 대해 다음이 적용됩니다. 학생은 "기타 폴더"에 포함되므로 중요한 부분은 다음과 같습니다.

default:other::---

이는 이 공유의 파일/폴더에 대해 "다른 사람"에게 권한이 부여되지 않음을 의미합니다. 아이디어는 폴더만 "기타"에서 rwx를 가져와야 하며 파일은 권한을 변경할 필요가 없다는 것입니다.

inotify-스크립트: submit_folder.sh

이 스크립트는 루트로 실행해야 하며, 유일한 인수는 위에서 방금 생성된 이 폴더입니다. 실행 방법에 대한 예를 들면 다음과 같습니다.

submission_folder.sh /path/to/fld

파일은 실행 가능하며 다음 내용을 포함합니다.

#!/bin/bash +x
dir=$1

if [[ -z $dir ]];
then
    echo "Enter path as argument"
    exit
fi
echo "WATCHING: $dir"

# run forever
while true; do

inotifywait -r -q --format %w%f -e create "$dir" | while read f; do 
    echo "- CREATED: $f"
    if [[ -d "${f}" ]] ; then
        echo "FOLDER: ${f}, adding read,write,execute permission"
        chmod o+rwx "${f}"
        stat "${f}"
    else
        echo "FILE: $f, doing noting"
    fi
done

done

스크립트가 실행되는 동안 모든 하위 폴더가 업데이트되어 rwx를 가져오고 탐색 및 나열될 수 있습니다.

주의사항:

  • 이것은 아직 삼바 공유가 아닌 로컬에서 테스트되었습니다. 나중에 이 작업을 수행할 예정이지만 공유에 제한을 두지 않고 모든 것을 파일 시스템에서 처리하도록 하려고 하므로 제대로 작동할 것입니다.

  • mkdir -p 폴더/하위 폴더를 사용하여 폴더를 생성했는데 둘 다 아직 존재하지 않으면 너무 빨리 생성되므로 inotify는 개별적으로 알림을 받지 않으므로 폴더를 rwx로 변경하지 않습니다. 해당 폴더에서는 마치 스크립트가 실행되지 않는 것처럼 보입니다. 이것은 그 자체로는 문제가 되지 않습니다. 왜냐하면 학생들은 더 적은 권리를 가지게 될 것이고 더 이상 부정행위가 허용되어서는 안 되기 때문입니다.

개인 메모

나는ipython 노트북누군가 관심이 있다면 몇 가지 테스트와 유틸리티 기능이 포함된 (파이썬 노트북이 아닌 bash 노트북) 그러나 내가 영어로 다시 모든 것을 하는 것이 너무 게으른 것에 따라 그것은 부분적으로 독일어입니다.

관련 정보