Samba访问失败主因是Linux文件权限、smb.conf配置与SELinux上下文三者不匹配;需用testparm验证语法、journalctl查日志、确保security=user、valid users生效、目录SGID权限及SELinux标签同步设置。

Linux Distros
Linux发行版游乐场,适用于需要临时Linux沙箱、基于浏览器的Linux虚拟机、一次性终端环境、桌面Linux会话等场景
下载
smbd 启不来、Windows 看得到共享名却打不开、输入密码后提示“拒绝访问”——这些问题八成不是配置漏了,而是权限叠加失效:Linux 文件系统权限 +
smb.conf 配置项 + SELinux 上下文,三者只要一个不匹配,就卡住。
验证配置语法再重启服务
smbd 对配置文件极其敏感,一个空格或拼写错误(比如把
read only = no 写成
readonly = no)就会直接拒载。别急着
systemctl restart smbd:
- 先运行
sudo testparm -v,它会逐行解析 /etc/samba/smb.conf,报错行号直接定位问题点
- 若输出 “Load smb config files from … OK”,说明语法过关;否则按提示修正
- 再查日志:
sudo journalctl -u smbd -n 20 --no-pager,重点看 “invalid path”、“can’t open secrets.tdb” 或 “security setting missing” 这类提示
-
[global] 段必须有 security = user,漏掉这行,valid users 全部失效
添加 Samba 用户前先确认系统用户存在
smbpasswd -a username 报错 “Failed to add entry for user”,根本原因不是密码输错,而是该用户在系统中根本不存在:
- 执行
id username,返回 “no such user” 就得先创建:sudo useradd -M -s /usr/sbin/nologin username
- 如果配置里写了
valid users = @sambashare,但用户没加进组,补上:sudo usermod -aG sambashare username
- SELinux 启用时,
smbpasswd 可能被阻止写入 /var/lib/samba/private/passdb.tdb;临时测试可 sudo setenforce 0,若成功则需修复上下文,而非永久关 SELinux
目录权限和 SELinux 上下文必须同步设置
Windows 能看到共享但打不开,90% 是目录权限或 SELinux 没配对:
- 目录权限必须带 SGID:
sudo chmod 2775 /srv/samba/shared(那个 2 很关键,保证新文件继承组所有权)
- 属组必须和
valid users = @sambashare 中的组名一致:sudo chgrp sambashare /srv/samba/shared
- 启用 SELinux 的系统(RHEL/CentOS/Rocky),必须打标签:
sudo semanage fcontext -a -t samba_share_t "/srv/samba/shared(/.*)?",然后 sudo restorecon -Rv /srv/samba/shared
- 别信 “chmod 777 就能通”——Samba 进程(通常是
nobody 或 root)仍可能因 SELinux 拒绝访问
防火墙和 NetBIOS 名称解析缺一不可
端口放行了还是连不上?
smbd 不只靠 TCP 445:
-
nmbd 依赖 UDP 137–138 做 NetBIOS 名称解析;Windows 客户端若发现不了机器名,大概率是 nmbd 没跑或 UDP 端口被拦
- 检查两个服务是否都 active:
sudo systemctl is-active smbd 和 sudo systemctl is-active nmbd
- 防火墙策略要放通整个
samba 服务(含 UDP):sudo firewall-cmd --permanent --add-service=samba(RHEL系)或 sudo ufw allow 'Samba'(Ubuntu)
- Windows 地址栏输
\192.168.x.xshared,不要加 http:// 或 smb://;Mac 用 smb://192.168.x.x/shared
最易忽略的是:Samba 访问是三层校验——
smb.conf 里的
valid users 控制谁“能登录”,目录的 Linux 权限控制谁“能读写文件”,SELinux 上下文控制 Samba 进程“能不能碰这个路径”。少一层,就断一层。