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 筆記本)有一些測試和實用函數,如果有人感興趣的話。然而,它有部分是德語,因為我懶得再用英語做這一切。