Você pode fazer com que o Samba normalize tudo que os clientes enviam, veja man smb.conf
para coisas como:
create mask = 0775
force create mode = 0660
directory mask = 2775
force directory mode = 2771
Eu testei isso em uma instalação limpa do Debian Jessie, mas eu também tenho esse problema em outras máquinas (ex: Ubuntu 12.04). Além da instalação básica, instalei sudo
, samba
e cifs-utils
.
Eu habilitei as ACLs no sistema de arquivos raiz e criei um diretório compartilhado:
sudo mount -o remount,acl /
mkdir -p /home/ryan/shared
setfacl -d -m u:ryan:rwx /home/ryan/shared
Eu deixei todos os padrões em /etc/samba/smb.conf
e adicionei um único compartilhamento:
[shared]
comment =
path = /home/ryan/shared
writable = yes
valid users = ryan
Então eu me adicionei como usuário do Samba e reiniciei o serviço:
sudo smbpasswd -a ryan
sudo systemctl restart smbd
Em seguida, criei um ponto de montagem para o compartilhamento do Samba, montei-o e criei um arquivo de texto vazio:
mkdir -p /home/ryan/mnt/shared
sudo mount -t cifs -o user=ryan //127.0.0.1/shared /home/ryan/mnt/shared
touch /home/ryan/mnt/shared/linux.txt
Eu também conectei de uma máquina com o Windows 8 e criei um arquivo de texto vazio chamado windows.txt
.
Depois disso, uma listagem de diretório de /home/ryan/shared
se parece com isso:
-rw-r--r--+ 1 ryan ryan 0 Jun 20 23:45 linux.txt
-rwxrwxr--+ 1 ryan ryan 0 Jun 20 23:46 windows.txt
A ACL de linux.txt
é assim:
# file: linux.txt
# owner: ryan
# group: ryan
user::rw-
user:ryan:rwx #effective:r--
group::r-x #effective:r--
mask::r--
other::r--
A ACL de windows.txt
é assim:
# file: windows.txt
# owner: ryan
# group: ryan
user::rwx
user:ryan:rwx
group::r-x
mask::rwx
other::r--
O comportamento do cliente Linux é o que eu esperaria. Por que é diferente ao usar um cliente Windows? Como posso fazer com que o cliente Windows defina as mesmas permissões que o cliente Linux?
Você pode fazer com que o Samba normalize tudo que os clientes enviam, veja man smb.conf
para coisas como:
create mask = 0775
force create mode = 0660
directory mask = 2775
force directory mode = 2771
Primeiro, com apenas essas permissões, você não precisa da ACL. A ACL é para permissões mais refinadas do que usuário, grupo e outros.
Mas, para responder à sua pergunta, meu palpite é que o arquivo criado pelo Linux obtém a permissão da configuração do usuário umask, provavelmente a mesma permissão que você obteria ao criar um arquivo em qualquer outro diretório.
O ambiente Windows não tem nada de umask, ele não sabe nada sobre o conceito de um grupo unix. Arquivos criados no Windows recebem permissão de configurações no smb.conf. Mesmo se você não inseriu essas configurações sozinho, elas possuem valores padrão. Você pode ver esses valores com o comando testparm -s -v smb.conf | grep mask
. A máscara em smb.conf tem o valor inverso comparado ao mesmo umask. Ou seja, para obter um arquivo com premission -rw-r - r-- você precisa de umask de 022, mas um samba cria uma máscara de 644.