Linux での inotifywait を使用した回避策:

Linux での inotifywait を使用した回避策:

Samba 共有には TO フォルダーが必要です。このフォルダーでは、誰でもファイルを作成、編集、削除できます。ただし、他のユーザーが作成したファイルを特定のユーザーが読み取ることはできません。

主なアイデアは、学生がテストを提出でき、他のクラスメートが書いたものを読まなくて済むフォルダを用意することです。不必要な制限は設けないでください。学生にはディレクトリの作成とファイルのコピーを許可する必要があります。学生同士は分離され、他の人のファイルを読み取ったり削除したりできないようにする必要があります。

Windows では、このようなフォルダーの ACL は次のようになります。

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

教師/所有者は、すべてのデータを収集するために、そのフォルダーの変更権限を持ちます。

ACL (setfacl、getfacl) を使用して Linux 上で同様のものを複製するにはどうすればよいでしょうか。あるいは、可能であれば、標準の Linux 権限のみを使用して ACL を使用せずに複製するにはどうすればよいでしょうか。

答え1

私は自分の質問に答えます。もし誰かがこの回答を改善できるなら、あるいは質問があるなら、ぜひそうしてください。この問題は、かなり長い間私を悩ませてきました。

私が尋ねたことは、POSIX ACL では不可能であるようです。 ACL を使用するディレクトリ内のグループ + rx 権限のみACL は継承された権限を適用するときにファイルとフォルダーを区別できないためです。

さらに調べてみると、次の 2 つの回避策が挙げられました。

  • 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

このスクリプトはルートで実行する必要があります。唯一の引数は、上記で作成したこのフォルダーになります。実行方法の例:

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 ノートブック(Python のノートブックではなく、bash のノートブック) テストとユーティリティ関数がいくつか含まれています。興味のある方はご覧ください。ただし、すべて英語で書くのは面倒だったので、一部ドイツ語になっています。

関連情報