Linux CIFS挂载中,username仅用于远程认证,真正控制本地读写权限的是uid/gid选项;vers=必须匹配服务端SMB版本(如Windows Server 2016+需vers=3.0),且应使用credentials文件而非明文密码,并注意SELinux/AppArmor限制。

挂载时用 username 和 uid/gid 控制读写权限
直接在 mount -t cifs 命令里指定 username 只是用于认证,不等于该用户就拥有文件系统上的读写权——真正起作用的是 uid 和 gid 选项,它们决定挂载后文件/目录在 Linux 侧的属主和属组。
-
username=admin:告诉远程 SMB 服务器用哪个账号登录(必须有共享访问权限) -
uid=1001:挂载后所有文件显示为 UID 1001 的用户所有(比如本地用户john),该用户才能正常ls、touch、rm -
gid=1001:同理控制组归属,配合dir_mode/file_mode决定是否可写 - 如果只设
username但没设uid,默认挂成 root:root,普通用户会提示Permission denied
vers= 参数必须匹配 Windows/Samba 服务端支持的协议版本
挂载失败常见报错 mount error(112): Host is down 或 mount error(13): Permission denied,往往不是网络或密码问题,而是 SMB 协议版本不兼容。Windows Server 2016+ 默认禁用 SMBv1,Linux 客户端若硬写 vers=1.0 就会连不上。
- Windows 10 / Server 2016+:优先试
vers=3.0,不行再降级到vers=2.1 - 旧 NAS 或 Windows Server 2008 R2:可能只支持
vers=2.0 - 绝对不要省略
vers=——内核默认行为不稳定,不同发行版可能 fallback 到 v1(已被多数服务端禁用) - 验证方式:
smbclient -L //192.168.1.100 -U admin --option='client min protocol=SMB3'
凭据别硬编码在命令行,用 credentials= 文件更安全
把 password=123456 写进 mount 命令,不仅会在 ps aux 里明文暴露,还可能被 shell 历史记录捕获。生产环境必须用独立凭据文件。
- 创建文件:
sudo tee /etc/smb.cred - 收紧权限:
sudo chmod 600 /etc/smb.cred(否则 mount 会拒绝读取) - 挂载时引用:
sudo mount -t cifs //192.168.1.100/share /mnt/smb -o credentials=/etc/smb.cred,uid=1001,gid=1001,vers=3.0 - 注意:文件路径必须是绝对路径,且不能有 BOM 或 Windows 换行符
SELinux 或 AppArmor 会拦截挂载后的文件操作
即使 mount 成功、ls 能看到文件,普通用户仍可能遇到 Operation not permitted 或无法保存编辑——这是 SELinux 默认策略阻止了 CIFS 挂载点的写入行为。
- 临时验证:运行
sudo setenforce 0,再测试写入;若恢复正常,就是 SELinux 干预 - 永久修复:给挂载点打上正确上下文:
sudo semanage fcontext -a -t cifs_t "/mnt/smb(/.*)?",然后sudo restorecon -Rv /mnt/smb - Ubuntu/Debian 用户需检查 AppArmor:
sudo aa-status | grep cifs,对应 profile 可能需要调整 - 跳过此步的后果:
cp失败、vim保存报错、GUI 应用完全不可见该目录
实际挂载命令里最容易被忽略的,是 vers= 和 SELinux 上下文这两项——前者导致连不上,后者导致连上了却用不了。











