在Ubuntu上配置Samba共享时,一种常见现象是客户端能正常浏览共享目录,但新建、删除或修改文件时系统提示权限不足,Windows端通常显示访问被拒绝,Linux端则可能直接报告Permission denied。这个问题不能只盯着smb.conf里的read only选项,因为Samba的最终写入权限由共享定义、用户认证和Linux文件系统权限共同决定。

一、先定位权限错误:查看配置与目录权限
遇到权限错误时,第一步应当确认Samba实际加载的共享参数。Ubuntu中smb.conf可能包含多个配置文件片段,手动查看容易遗漏,使用testparm -s可以输出最终生效的配置。重点检查目标共享是否包含read only = yes、writeable = no、valid users限制过严,或者没有配置必要的force group。很多情况下,配置文件中写的是read only = no,但valid users只允许了某个不存在的Samba用户,认证失败后访问会退化为匿名用户,最终仍然无法写入。
第二步是检查共享目录在Linux层面的权限。Samba对共享目录的写入请求,最终会以当前Samba用户对应的系统用户身份执行,因此目录的属主、属组和其他用户权限位非常关键。可以在Ubuntu服务器上执行ls -ld /共享路径查看权限,也可以用getfacl检查扩展ACL。如果目录属主是root且权限为755,普通Samba用户即使通过认证也不具备写入权限。此时需要将目录属组改为共享组,并授予组写权限。
sudo testparm -s | grep -A 20 '\[share\]' sudo ls -ld /srv/samba/share sudo getfacl /srv/samba/share sudo smbstatus -b
此外,Samba自己的日志也能提供关键信息。Ubuntu下日志通常位于/var/log/samba/目录,可以查看log.smbd或具体客户端IP日志,寻找NT_STATUS_ACCESS_DENIED或相关的用户名映射失败记录。
二、修复共享定义与文件系统权限
修复的第一步是整理Samba用户和系统组。建议为共享目录创建一个专用组,例如sambashare,并把需要访问的用户加入该组。Samba用户必须同时存在于系统中,否则smbpasswd添加用户时会报错。示例中使用shareuser作为普通系统用户,并设置Samba访问密码。
sudo groupadd sambashare sudo useradd -M -s /usr/sbin/nologin shareuser sudo usermod -aG sambashare shareuser sudo smbpasswd -a shareuser sudo smbpasswd -e shareuser
接着编辑/etc/samba/smb.conf,定义共享段。这里需要特别注意几个参数:read only = no用于允许写入;valid users = @sambashare限制只有该组成员可访问;force group = sambashare让所有写入文件自动归属到共享组;create mask = 0664和directory mask = 2775控制新建文件与目录的默认权限。directory mask中的2代表setgid位,可以让新建子目录继承父目录的组身份。
[share]
path = /srv/samba/share
browseable = yes
read only = no
valid users = @sambashare
force group = sambashare
create mask = 0664
directory mask = 2775
guest ok = no然后设置目录权限。创建目录并调整属组为sambashare,使用chmod 2775开启setgid位,这样后续新建文件和目录都能保持正确的组归属。如果目录已经存在且内部有旧文件,建议使用chgrp -R递归调整属组,并使用chmod -R g+w保证组可写。
sudo mkdir -p /srv/samba/share sudo chown root:sambashare /srv/samba/share sudo chmod 2775 /srv/samba/share sudo chgrp -R sambashare /srv/samba/share sudo chmod -R g+w /srv/samba/share sudo systemctl restart smbd
完成上述操作后,如果仍然无法写入,需要检查Samba的全局设置中是否存在map to guest = Bad User之类的参数,它可能让认证失败的用户以guest身份访问,而guest通常没有写权限。还要确认没有在共享段设置write list与valid users冲突。可以使用testparm再次检查输出。
三、验证写入并处理顽固问题
配置修复后,不要只凭客户端提示判断,建议先在Ubuntu本机用smbclient进行验证。smbclient可以模拟SMB客户端访问共享,-U指定用户,-c执行命令。以下示例连接本机共享并尝试创建testfile.txt,如果成功且没有报NT_STATUS_ACCESS_DENIED,说明权限配置基本正确。
sudo apt install smbclient -y smbclient //127.0.0.1/share -U shareuser -c 'mkdir testdir; put /etc/hostname testfile.txt; ls'
在Windows客户端中,建议先断开旧映射,重新连接并输入Samba用户名和密码。有时Windows会缓存旧凭据,导致即使服务器权限正确仍然提示访问被拒绝。可以在Windows命令提示符中使用net use * /delete清理连接,再重新映射网络驱动器。需要留意Ubuntu的防火墙是否放行了Samba端口,常见端口包括139和445。使用ufw命令放行Samba或直接允许局域网网段访问。
sudo ufw allow samba sudo ufw status verbose
如果共享目录位于外置硬盘或挂载分区,还要检查挂载选项是否包含只读或权限限制。某些文件系统挂载后默认只读,或者挂载时使用了noexec等选项,也会导致Samba写入失败。查看mount输出确认挂载参数,重新挂载时加入rw和适合的umask。此外,Ubuntu中AppArmor一般不会主动限制Samba写入自定义路径,但如果路径非常特殊,可以在/var/log/syslog中查找apparmor拒绝记录。
还有一类容易被忽略的问题是用户主目录加密或权限过严。如果共享路径位于/home下的加密目录,Samba进程可能无法读取用户挂载的数据。此时更稳妥的做法是将共享数据迁移到/srv或独立数据盘,并确保smbd服务对该路径具有遍历权限。完成所有调整后,再次通过smbclient和Windows客户端测试新建、修改、删除三个操作,确认问题真正解决。
Ubuntu Samba共享权限Samba权限修复修改时间:2026-08-28 08:17:42