Estou tentando configurar uma área no meu sistema de arquivos ext4
(no Debian Jessie), onde todos os membros do grupo "staff" podem ler e gravar arquivos existentes e recém-criados.
O sistema de arquivos é montado com a opção acl:
$ more /etc/fstab | grep acl
UUID=f47c5337-a6e1-4554-b8c0-e05c761ec835 / ext4 noatime,errors=remount-ro,acl 0 1
Eu criei alguns scripts bash para definir ACLs de forma direta e testá-lo em vários cenários.
O primeiro ( createtestdir.sh
) cria um diretório de teste com alguns arquivos e dir dentro:
#!/bin/bash
if [ $# != 1 ]; then
echo "usage: $0 /path/to/new/directory"
exit
fi
if [ ! -d "$1" ] && [ ! -f "$1" ] && [ ! -L "$1" ]
then
mkdir $1
mkdir $1/dir
touch $1/file
touch $1/dir/file
echo "Directory $1 created"
else
echo "$1 already exist"
fi
O segundo ( setacl.sh
) definir permissões e ACLs no diretório especificado, talvez surjam problemas aqui:
#!/bin/bash
if [ $# != 1 ]; then
echo "usage: $0 /path/to/directory"
exit
fi
if [ -d "$1" ]; then
chgrp -R staff $1
chmod g+rwxs $1
setfacl -dm group:staff:rwx $1
/usr/bin/find $1 -type d -exec chmod g+rwxs {} +
/usr/bin/find $1 -type d -exec setfacl -dm group:staff:rwx {} +
/usr/bin/find $1 -type f -exec chmod g+rw {} +
/usr/bin/find $1 -type f -exec setfacl -m group:staff:rw {} +
echo "Permission changed"
else
echo "Directory $1 does not exist"
fi
Finalmente, o terceiro script ( acltest.sh
) testa o comportamento da ACL criando arquivos e diretórios, movendo, copiando e descompactando e arquivando:
#!/bin/bash
if [ $# != 1 ]; then
echo "usage: $0 /path/to/directory"
exit
fi
if [ -d "$1" ]
then
#testing acl
mkdir $1/test_dir
touch $1/test_dir/file
touch $1/test_file
# testing mv
touch $1/file_from_internal
touch file_from_external
ls -l file_from_external
mv file_from_external $1
# testing tar && cp
mkdir test_tar
touch test_tar/file
tar cjf test.tar.bz2 test_tar
cp test.tar.bz2 $1
ls -ld test_tar
ls -l test.tar.bz2
rm -rf test_tar
rm test.tar.bz2
cd $1
tar xjf test.tar.bz2
echo "Test on $1 completed"
else
echo "$1 already exist"
fi
Executando os scripts, os scripts na ordem correta fornecem a seguinte saída:
$ ./createtestdir.sh Acl
Directory Acl created
$ ./setacl.sh Acl/
Permission changed
$ ./acltest.sh Acl/
-rw-r--r-- 1 gabo gabo 0 feb 24 11:58 file_from_external
drwxr-xr-x 2 gabo gabo 4096 feb 24 11:24 test_tar
-rw-r--r-- 1 gabo gabo 146 feb 24 11:24 test.tar.bz2
Test on Acl/ completed
Imprimi as permissões do diretório e do arquivo que são descompactados e copiados dentro do diretório de teste do Acl, para que possam ser comparados com os respectivos arquivos dentro do diretório de teste do Acl.
Como você pode ver com ls, pemissions e ACLs não são os esperados (por mim, é claro :)
$ ls -l Acl/
totale 16
drwxrwsr-x+ 2 gabo staff 4096 feb 24 11:24 dir
-rw-rw-r--+ 1 gabo staff 0 feb 24 11:24 file
-rw-r--r-- 1 gabo gabo 0 feb 24 11:24 file_from_external
-rw-rw-r--+ 1 gabo staff 0 feb 24 11:24 file_from_internal
drwxrwsr-x+ 2 gabo staff 4096 feb 24 11:24 test_dir
-rw-rw-r--+ 1 gabo staff 0 feb 24 11:24 test_file
drwxr-sr-x+ 2 gabo staff 4096 feb 24 11:24 test_tar
-rw-r--r--+ 1 gabo staff 146 feb 24 11:24 test.tar.bz2
file_from_internal está ok. Foi criado dentro do diretório e tem permissões corretas e ACL.
file_from_external não está ok. Ele foi movido do diretório pai, ele carrega as permissões antigas e não tem a ACL. Parece que o comando mv não funciona com o ACL .
test.tar.bz2 é estranho. Ele foi copiado do diretório pai, ele carrega as permissões antigas e implementa a ACL incorreta (o arquivo não pode ser gravado pelo grupo da equipe):
$ getfacl Acl/test.tar.bz2
# file: Acl/test.tar.bz2
# owner: gabo
# group: staff
user::rw-
group::rwx #effective:r--
group:staff:rwx #effective:r--
mask::r--
other::r--
Parece que o cp também não funciona com o ACL
O diretório
test_tar também não tem permissão de gravação em grupo, mas herda o comportamento padrão da ACL: /
$ getfacl Acl/test_tar
# file: Acl/test_tar
# owner: gabo
# group: staff
# flags: -s-
user::rwx
group::rwx #effective:r-x
group:staff:rwx #effective:r-x
mask::r-x
other::r-x
default:user::rwx
default:group::rwx
default:group:staff:rwx
default:mask::rwx
default:other::r-x
Se eu tentar criar um arquivo dentro de test_tar usando um usuário diferente (membro da equipe), recebo um erro de permissão negada.
O que há de errado no meu script setacl.sh? Talvez haja algum bug / pegadinha / comportamento que eu não conheço?
Desculpe pela longa pergunta, mas eu gostaria de fornecer um conjunto de testes replicável para verificar em diferentes ambientes sem precisar digitar muitos comandos de shell.