如何使用 OSX 客户端在 Samba 上保持组可写共享?

Der*_*ler 6 samba freenas cifs osx-mountain-lion

我在 OSX 和 Windows 客户端的网络上有一个 FreeNAS 服务器。当 OSX 客户端与服务器上的 SMB/CIFS 共享交互时,它们会导致所有其他客户端出现权限问题。

更新:我无法再验证任何答案,因为我们放弃了该项目,但请随时为未来的访问者发布任何帮助。

此行为的详细信息似乎还取决于客户端运行的 OSX 版本。对于这个问题,让我们假设一个运行 10.8.2 的客户端。

当我在 OSX 客户端上安装 CIFS 共享并在其上创建一个新目录时,将使用drwxr-x-rx权限创建该目录。这是不可取的,因为它不允许除我之外的任何人写入该目录。我的组中还有其他用户也应该具有写入权限。即使smb.conf服务器上存在以下设置,也会发生此行为:

[global]
create mask= 0666
directory mask= 0777
[share]
force directory mode= 0775
force create mode= 0660

我的印象是这些设置应该确保目录至少是使用rwxrwxr-x权限创建的。但是,我想,这并不能阻止客户端创建目录更改权限。

当我从 Windows 客户端在同一共享上创建文件夹时,新文件夹将具有所需的访问权限 ( rwxrwxrwx),因此我目前假设问题出在 OSX 客户端上。

如果您可以轻松更改您创建的目录的权限,我想这不会是一个问题,但您不能。在 Finder 中打开目录信息时,我收到旧的“您具有自定义访问权限”通知,但无法进行任何更改。

在此处输入图片说明

我假设这是因为我们在共享上使用了 Windows ACL,但这只是一个疯狂的猜测。

通过终端更改组的写入权限工作正常,但这对于部署来说是不切实际的,并且期望任何人都这样做是不合理的。

这是完整的smb.conf

[global]
    encrypt passwords = yes
    dns proxy = no
    strict locking = no
    read raw = yes
    write raw = yes
    oplocks = yes
    max xmit = 65535
    deadtime = 15
    display charset = LOCALE
    max log size = 10
    syslog only = yes
    syslog = 1
    load printers = no
    printing = bsd
    printcap name = /dev/null
    disable spoolss = yes
    smb passwd file = /var/etc/private/smbpasswd
    private dir = /var/etc/private
    getwd cache = yes
    guest account = nobody
    map to guest = Bad Password
    obey pam restrictions = Yes
    # NOTE: read smb.conf.
    directory name cache size = 0
    max protocol = SMB2
    netbios name = freenas
    workgroup = COMPANY
    server string = FreeNAS Server
    store dos attributes = yes
    hostname lookups = yes
    security = user
    passdb backend = ldapsam:ldap://ldap.company.local
    ldap admin dn = cn=admin,dc=company,dc=local
    ldap suffix = dc=company,dc=local
    ldap user suffix = ou=Users
    ldap group suffix = ou=Groups
    ldap machine suffix = ou=Computers
    ldap ssl = off
    ldap replication sleep = 1000
    ldap passwd sync = yes
    #ldap debug level = 1
    #ldap debug threshold = 1
    ldapsam:trusted = yes
    idmap uid = 10000-39999
    idmap gid = 10000-39999
    create mask = 0666
    directory mask = 0777
    client ntlmv2 auth = yes
    dos charset = CP437
    unix charset = UTF-8
    log level = 1


[share]
    path = /mnt/zfs0
    printable = no
    veto files = /.snap/.windows/.zfs/
    writeable = yes
    browseable = yes
    inherit owner = no
    inherit permissions = no
    vfs objects =  zfsacl
    guest ok = no
    inherit acls = Yes
    map archive = No
    map readonly = no
    nfs4:mode = special
    nfs4:acedup = merge
    nfs4:chown = yes
hide dot files
force directory mode = 0775
force create mode = 0660
Run Code Online (Sandbox Code Playgroud)

Can*_*uke 1

更改您的共享定义以仅包含以下内容:

path = /path/to/folder
browseable = yes
writeable = yes
inherit permissions = yes
Run Code Online (Sandbox Code Playgroud)

现在,直接更改文件夹的权限:

# chown user:group -R /path/to/folder
# chmod 2770 -R /path/to/folder (or 2775 for public read only)
Run Code Online (Sandbox Code Playgroud)

上面的 CHMOD 命令将应用“特殊”权限,这允许放置在该文件夹中的文件夹自动采用父级的权限。要使其生效:

/etc/init.d/samba reload
Run Code Online (Sandbox Code Playgroud)

交换机reload不会重新启动 samba(踢出当前用户),而是重新加载配置文件。


FreeNAS Wiki上也有记录:

如果权限适用于 Windows 用户但不适用于 OS X 用户,请尝试禁用 Unix 扩展并重新启动 CIFS 服务。