Linux 上 inotifywait 的解決方法:

Linux 上 inotifywait 的解決方法:

Samba 共享上應該有一個 TO 資料夾,每個人都可以在其中建立文件、編輯和刪除文件。但不應允許某一使用者讀取其他使用者所建立的檔案。

主要想法是建立一個資料夾,學生可以在其中提交測試,而不必閱讀其他同學寫的內容。不應有不必要的限制。應該允許學生建立目錄、複製檔案。他們應該彼此分開,不要讀取/刪除其他人的文件。

在 Windows 上,此類資料夾的 ACL 類似於:

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

教師/所有者將擁有所述資料夾中的修改權限以收集所有資料。

我將如何使用 ACL(setfacl、getfacl)在 Linux 上複製類似的內容,或者如果可能的話,不使用它們,僅使用標準 Linux 權限?

答案1

我會回答我自己的問題。如果有人可以改進這個答案,或者有一些問題,那麼一定要這樣做。這個特殊的問題已經困擾我很久了。

根據以下內容,我所要求的 POSIX ACL 似乎不可能實現: 僅限使用 ACL 的目錄中的 Group+rx 權限因為在套用繼承的權限時,ACL 無法區分檔案和資料夾。

進一步看,提到了兩種可能的解決方法:

  • inotify(我在這裡使用的)
  • bindfs(如果有人嘗試這個,請發文)

Linux 上 inotifywait 的解決方法:

資料夾權限

以 root 身分執行以下操作:

建立要共享的資料夾:

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-腳本:submission_folder.sh

該腳本應由 root 運行,唯一的參數是上面剛剛建立的資料夾。作為如何運行它的範例:

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,從而可以遍歷和列出。

注意事項:

  • 這是在本地測試的,尚未在 samba 共享中測試。我稍後會這樣做,但它應該可以工作,因為我打算不在共享中施加任何限制,並讓所有內容都由檔案系統處理

  • 如果使用 mkdir -p 資料夾/子資料夾建立資料夾且兩者都不存在,那麼它們的建立速度會非常快,inotify 不會單獨收到通知,因此不會將資料夾變更為 rwx。對於這些資料夾來說,就好像腳本沒有運行一樣。這本身不是問題,因為學生的權利會減少,而不是更多,而且不可能作弊

個人筆記

我創建了一個ipython 筆記本(bash 筆記本,不是 python 筆記本)有一些測試和實用函數,如果有人感興趣的話。然而,它有部分是德語,因為我懶得再用英語做這一切。

相關內容