samba的create mask并非重写系统umask,而是独立控制客户端新建文件权限上限,通过与客户端请求权限按位与运算生效,效果类似umask但不继承系统umask值,需配合directory mask、force模式及linux目录权限协同实现组协作权限控制。

Samba 的 create mask 并不是直接“重写”系统 umask,而是独立控制客户端在共享目录中新建文件的权限位。它作用于 Samba 服务端,对通过 SMB/CIFS 协议创建的文件生效,与 Linux 系统级 umask 逻辑不同但效果相似——都是限制最终权限的上限。
create mask 如何模拟 umask 行为
Linux 的 umask(如 002)是从默认权限(文件666、目录777)中“屏蔽”掉对应位;Samba 的 create mask = 0644 则是直接设定新建文件权限的“最大允许值”,再与客户端请求的 DOS 权限映射结果做按位与运算。实际效果接近:设 create mask = 0664,相当于让新建文件最多拥有 rw-rw-r-- 权限,等效于 umask 0002 对 666 的结果。
-
create mask = 0644→ 文件权限不会超过 rw-r--r--(即 umask 0022 效果) -
create mask = 0664→ 文件权限不会超过 rw-rw-r--(即 umask 0002 效果) -
directory mask = 0755→ 目录权限不会超过 rwxr-xr-x(类似 umask 0022 对 777)
关键区别:不继承系统 umask
Samba 不读取或应用 shell 启动时设置的 umask 值。即使你用 umask 0002 启动 smbd 进程,也不会影响客户端上传文件的权限。所有权限由 create mask、directory mask 及其 force 版本共同决定。
- 客户端上传一个原本应为 666 的文件 → Samba 将其与
create mask按位与,得到最终权限 - 若同时设置了
force create mode = 0200,则“可写”位一定会保留(或操作),进一步修正结果 - 真实权限还受共享目录本身的 Linux 权限和所属组影响(例如目录需有 g+w 才能让组写生效)
配合 group 和强制权限实现 umask-like 一致性
要让多个用户在共享中协作且权限统一,仅靠 create mask 不够,还需结合 Linux 文件系统层控制:
- 确保共享目录属组正确,且设置了 setgid(
chmod g+s /path),使新文件自动继承目录所属组 - 配置
force group = samba_users,强制所有新建项归属指定组 - 搭配
directory mask = 0775和create mask = 0664,实现类似 umask 0002 的组协作效果
验证与调试建议
修改后务必用 testparm -v | grep -A2 "create mask" 查看实际生效值,并从 Windows 或 Linux 客户端新建文件,再用 ls -l 检查权限是否符合预期。
- 注意:Windows 客户端通常不发送完整 Unix 权限,Samba 依赖 mask 规则补全
- 若发现权限过宽(如出现 666),检查是否遗漏
create mask,或被force create mode覆盖 - SELinux 或 AppArmor 可能拦截权限设置,需确认上下文允许(
ls -Z查看)











