Eu responderei minha própria pergunta. Se alguém puder melhorar esta resposta, ou tiver algumas perguntas, então faça isso. Este problema particular me incomodou por algum tempo agora.
O que eu perguntei parece não ser possível com POSIX ACLs de acordo com: Group + rx permissão apenas em diretórios usando ACL como ACLs não podem distinguir entre arquivos e pastas, ao aplicar direitos herdados.
Além disso, duas possíveis soluções alternativas foram mencionadas:
- inotify (que eu usei aqui)
- bindfs (se alguém tentar isso, por favor poste)
Uma solução alternativa com inotifywait no linux:
Permissões de pasta
Como root, faça o seguinte:
Crie a pasta para compartilhar:
mkdir fld
Crie o grupo de pastas principais no grupo de professores. O grupo deve existir e ser o grupo primário de professores.
chown :teach fld
Deixe o grupo ser herdado por todos os arquivos / subpastas. Isso significa que o professor deve ser capaz de ler / escrever / apagar
chmod g+s fld
Não permitir sobrescrever / excluir arquivos de outras pessoas (como as permissões / tmp)
chmod +t fld
Agora, as ACLs serão definidas para herdar direitos mínimos em todos os arquivos / subpastas criados nesta pasta:
setfacl -m u::rwx,g::rwx,o::rwx,d:u::rwx,d:o::--- fld
A pasta principal, que deve conter todas as subpastas / arquivos criados pelos alunos, deve ficar assim agora:
getfacl fld
# file: fld
# owner: root
# group: teach
# flags: -st
user::rwx
group::rwx
other::rwx
default:user::rwx
default:group::rwx
default:other::---
Estas permissões sozinhas têm algum mérito. Se o script abaixo não for executado, as permissões da pasta acima permitirão que os alunos criem / leiam // editar / excluir seus próprios arquivos e não façam isso com arquivos de outras pessoas. A pasta deve se comportar normalmente, ou seja, é permitido ver / listar todos os arquivos. A única limitação é que ele funciona apenas diretamente nessa pasta, não em subpastas. Isso deve ser suficiente para submissões simples de vários arquivos pelos alunos.
Para todas as subpastas, criadas pelos alunos, aplica-se o seguinte: Os alunos serão agrupados em "outros", por isso, a parte importante é:
default:other::---
Isso significa que nenhum direito será concedido a "outros" para arquivos / pastas nesse compartilhamento. A idéia é que as pastas sozinhas devem obter o rwx em "outros", os arquivos não precisam alterar as permissões.
inotify-Script: submission_folder.sh
Este script deve ser executado por root, o único argumento será esta pasta, que acabou de ser criada acima. Como um exemplo de como executá-lo:
submission_folder.sh /path/to/fld
O arquivo é executável e possui este conteúdo:
#!/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
Enquanto o script estiver em execução, ele atualizará todas as subpastas para que elas obtenham o rwx e possam, portanto, ser percorridas e listadas.
advertências:
-
Isso foi testado localmente, e não em um compartilhamento de samba ainda. Eu farei isso mais tarde, mas deve funcionar como eu pretendo não impor quaisquer restrições no compartilhamento e deixar tudo ser manipulado pelo sistema de arquivos
-
Se as pastas forem criadas com a pasta / subpasta mkdir -p e as duas não existirem ainda, elas serão criadas tão rapidamente que o inotify não será notificado individualmente e, portanto, não alterará as pastas para rwx. Para essas pastas, é como se o script não estivesse em execução. Este não é um problema em si, já que os alunos terão menos direitos, não mais e não será possível fazer batota
Notas pessoais
Eu criei um ipython-notebook (bash notebook, não um python one) com alguns testes e funções de utilitário , se alguém estiver interessado. No entanto, é parcialmente alemão, já que eu estava com preguiça de fazer tudo em inglês novamente.