如何在Windows不开启不安全来宾访问的前提下实现Samba共享的公开访问
如何在Windows不开启不安全来宾访问的前提下实现Samba共享的公开访问
刚好碰到过和你一模一样的需求,给你一套亲测能用的方案——核心就是让Samba把所有客户端发来的用户都映射到服务器上的一个专用账号,同时绕过密码验证,这样Windows客户端不用改任何组策略,随便输个用户名密码就能访问,完美替代原来的来宾访问功能。
具体操作步骤:
1. 创建专用共享账号
在Samba服务器上创建一个只用于共享访问的本地用户(不给它系统登录权限),再添加到Samba用户列表:
# 创建无系统登录权限的专用用户 useradd -r -s /sbin/nologin public_user # 给该用户设置Samba密码(随便设即可,后续不会验证这个密码) smbpasswd -a public_user
2. 配置用户映射:所有客户端用户转成专用账号
创建Samba用户映射文件,把客户端发来的任意用户名都映射到刚才创建的public_user:
echo "* = public_user" > /etc/samba/smbusers
打开Samba主配置文件/etc/samba/smb.conf,在[global]段添加以下内容,指定使用这个映射文件:
[global] # 保留原有全局配置,新增此行 username map = /etc/samba/smbusers
3. 让Samba接受任意密码
修改PAM配置,让它对Samba的认证请求直接放行——不管客户端输入什么密码都视为通过:
# 先备份原配置文件,防止出错 cp /etc/pam.d/samba /etc/pam.d/samba.bak # 写入新的PAM规则 echo "auth required pam_permit.so" > /etc/pam.d/samba echo "account required pam_permit.so" >> /etc/pam.d/samba
4. 配置目标共享
在smb.conf末尾添加公开共享的配置(以安装包共享为例):
[public_installs] path = /mnt/public_install_kits # 替换成你的共享目录路径 comment = Public Installation Kits browseable = yes read only = yes # 若需要写入权限,改为no,后续需调整目录权限 force user = public_user # 强制用该用户执行所有共享操作 encrypt passwords = yes passdb backend = tdbsam guest ok = no # 禁用来宾访问,避免触发Windows安全限制 map to guest = never
5. 设置共享目录权限
确保public_user对共享目录有足够权限,只读场景执行:
chown public_user:public_user /mnt/public_install_kits chmod 755 /mnt/public_install_kits
若需写入权限,将chmod命令改为775即可。
6. 重启Samba服务生效
systemctl restart smbd nmbd
测试验证
找一台Windows客户端,打开文件资源管理器,输入\\你的服务器IP\public_installs,弹出登录窗口时随便输入用户名和密码(比如test/123456),就能直接访问共享,完全无需修改Windows组策略!
注意事项
- 此PAM配置会让所有Samba共享都接受任意密码,若服务器还有其他需严格认证的共享,该方案不适用。如需区分,可考虑运行两个独立的Samba实例,分别配置不同规则。
- 公开共享建议设为只读,避免误操作或恶意修改。
- 确保服务器防火墙允许139、445端口的入站流量,否则客户端无法连接。
备注:内容来源于stack exchange,提问作者Valentin Radu




