在 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-notebook(bash 笔记本,不是 python 笔记本)包含一些测试和实用函数,如果有人感兴趣的话。不过它有一部分是德语的,因为我太懒了,不想再用英语来做。

相关内容