RHEL挂载Win2012 R2 CIFS共享 普通用户脚本创建文件权限被拒
CIFS协议挂载默认不会自动映射本地普通用户权限,你使用sudo执行挂载操作且未带权限映射参数时,整个挂载点的默认所有者为root,仅root账户拥有目录级写入权限:
- 执行
sudo nano myfile.txt时进程提权为root身份,不受权限限制可以正常创建文件 - 已有文件的读写执行正常,是默认挂载参数开放了其他用户的基础读/执行权限,部分文件权限位额外开放了写入
- 执行
python myscript.py > output.txt时,创建output.txt的操作是由当前登录的普通用户权限运行的shell完成的,该用户对挂载目录没有新建文件的权限,因此直接返回permission denied。
- 先卸载当前异常的挂载点
sudo umount /home/user1/myfolder
如果提示设备忙,就先退出所有在这个目录下操作的终端、进程再重试。
查询当前普通用户的UID和GID,直接在终端执行
id命令即可获取,输出示例里uid=1000(user1) gid=1000(user1) groups=...,对应的uid、gid数值替换到后续挂载命令里即可,一般本地创建的第一个普通用户默认uid/gid都是1000。带权限参数重新挂载
sudo mount -t cifs //192.168.100.1/myfolder/ /home/user1/myfolder -o username=MyRegisteredUserNameForServer,uid=1000,gid=1000,file_mode=0755,dir_mode=0755
参数说明:
uid=xxx:将共享内所有文件/目录的所有者映射为本地对应用户gid=xxx:将共享内所有文件/目录的所属组映射为本地对应用户组file_mode=0755:设置挂载后文件的默认权限,所有者拥有读写执行权限,其余用户拥有读、执行权限dir_mode=0755:设置挂载后目录的默认权限,所有者拥有读写、进入权限,其余用户拥有读、进入权限验证修复结果
切回普通用户身份,在挂载目录下执行touch test.txt,如果没有报错,再执行原脚本重定向命令即可正常生成输出文件。
如果需要开机自动挂载该共享,编辑/etc/fstab文件,追加如下配置行(替换其中的密码、uid/gid为你实际的值即可):
//192.168.100.1/myfolder/ /home/user1/myfolder cifs defaults,username=MyRegisteredUserNameForServer,password=你的Windows共享访问密码,uid=1000,gid=1000,file_mode=0755,dir_mode=0755 0 0
保存后执行sudo mount -a,没有报错即配置正常,重启后也会自动挂载。如果不想把密码明文写在fstab里,可以创建一个权限为600的凭证文件存储账号密码,在挂载参数里用credentials=/path/to/credfile替换明文账号密码配置即可。
如果按照上述步骤操作后仍然报权限错误,先临时关闭SELinux测试:
sudo setenforce 0
关闭后操作正常的话,就是SELinux拦截了普通用户对CIFS挂载点的写入,重新挂载时在-o参数里追加context=unconfined_u:object_r:user_home_t:s0即可,不需要永久关闭SELinux。
内容的提问来源于stack exchange,提问作者shivam

