samba 共享的目录 Windows 能打开却写不进文件,权限到底卡在哪一层
在 Ubuntu 上建了个目录,通过 samba 共享给局域网,Windows 那头网上邻居能进、文件能看,想拖个文件进去却被拒——粘贴不行、新建不行、重命名也不行,三个动作全被挡在外面。检查共享配置似乎又没什么毛病。这类"看得见、摸不着"的只读困局,是 samba 排障里出现频率很高的一类,卡点几乎都出在三层权限没有对齐,这篇把这层窗户纸捅破。
原因分析
samba 的写权限是一道三重门,三层全开才写得进去。一层是共享定义:smb.conf 里该共享段要写明 writeable = yes(或 read only = no),没写这段就是按只读出;另一层是 Linux 文件系统权限:samba 是替某个系统账号在干活,这个账号对目录本身没有写位,照样写不进——samba 只能把 Linux 上真实存在的权限交出去,给不出目录本身没有的权利;还有一层是 samba 自己的账号库:smbpasswd 登记的密码与系统登录密码是两套体系,Windows 弹窗登录用的账号没在 samba 库里建档,或被当成访客放进来,多半也会落到只读待遇上。三层里任何一层没对齐,表现都是同一个"写不进"。
分步解决
- 先查共享定义:打开 smb.conf 找到该共享段,确认 writeable = yes 在位;改动后用 testparm 过一遍语法,再执行 systemctl reload smbd 让配置生效。
- 补 samba 账号:用 smbpasswd -a 用户名 把干活账号登记进 samba 密码库;Windows 端访问时选这个账号登录,别点匿名或访客身份。
- 对齐目录属主:ls -ld 看目录的属主属组,让 samba 的干活账号要么是属主、要么在属组里;用 chown -R 账号:组 目录 调整归属,再 chmod 2775 补上组写位和 setgid 位,新建的文件也能继承同组权限。
- 清掉 Windows 旧凭据:之前用别的账号连过,Windows 会揣着旧凭据不放;到控制面板的凭据管理器删掉该地址的记录,或命令行执行 net use * /delete 清空后重连。
- 三动作复验:重新连接后在目录里新建一个文本文件、改名、再删除,三个动作都过,写权限才算真通;只测新建不测改名,容易漏掉组写位没吃透的情况。
预防
共享目录在规划阶段就按组管理:目录挂到共享组名下,setgid 位固住权限继承,samba 配置每次改动后 testparm 复验一遍再重载。交共享环境那天,我们贵州诚鑫致达科技会让接手的人当场新建、改名、删除各做一遍——三个动作过手,权限才算真交清。