![如何向普通用户授予 mount.cifs 权限以及注销前是否强制卸载](https://linux22.com/image/929736/%E5%A6%82%E4%BD%95%E5%90%91%E6%99%AE%E9%80%9A%E7%94%A8%E6%88%B7%E6%8E%88%E4%BA%88%20mount.cifs%20%E6%9D%83%E9%99%90%E4%BB%A5%E5%8F%8A%E6%B3%A8%E9%94%80%E5%89%8D%E6%98%AF%E5%90%A6%E5%BC%BA%E5%88%B6%E5%8D%B8%E8%BD%BD.png)
操作系统:Ubuntu MATE 20.04.1 x64_86
我需要创建一个到文件服务器(具有 NFS 和 Microsoft Active Directory 的环境)的网络驱动器,并能够通过 Bash 脚本对其进行读取/写入。经过一番谷歌搜索,我找到了一个解决方案(以下是我的 Bash 脚本中安装驱动器的较大程序的一部分):
readonly srv_conn_str="//remote-usrs-srv/Users$"
mount.cifs "${srv_conn_str}" ~/drive_usr -o username="${user}",password="${password}",dom="AD",vers=1.0
上面的代码可以完成任务,但只有当我使用 sudo(root 权限)运行 mount.cifs 时,它才会起作用。现在的问题是,这个 Ubuntu 系统实际上是一个带有 GUI 的虚拟机,有多个用户连接到它。每个用户都需要在其~/drive_usr
目录中创建挂载点(使用其 Windows 帐户 ID 和密码)。因此,除非每个人都有 sudo 用户的密码,否则我看不到任何其他方法来运行此命令,显然这不是一个选择。因此,我有两个问题:
问题 1:是否有任何系统级配置允许以普通用户身份运行 mount.cifs,而不仅仅是由系统管理员运行?
问题2:在每个用户关闭当前会话之前,应该~/drive_usr
通过卸载命令?现在我问这个问题的原因显然是我在这个领域真的是个新手,所以我不知道在不卸载已经挂载的网络驱动器的情况下关闭会话是否mount.cifs
会对远程服务器上的原始数据造成任何损害,就像我们在没有先卸载它的情况下移除了一个 USB 记忆棒一样,这是不推荐的,可能会导致数据丢失。
编辑 1:(根据建议的钒溶液)
我将以下行附加到 /etc/fstab:
//remote-usrs-srv/Users$ /home/mylinux_username/drive_usr cifs user,noauto,rw,suid,exec,dev,iocharset=utf8,username=my_windows_username,domain=AD,vers=2.0 0 0
这几乎解决了问题。现在我需要做的无需使用 sudo是在我的 Bash 脚本中运行以下命令:
readonly srv_conn_str="//remote-usrs-srv/Users$"
mount.cifs "${srv_conn_str}" ~/drive_usr
一旦用户的 Windows 密码作为命令行参数提供在我的脚本中,它就会挂载驱动器。但是,仍然存在两个问题:
我可以不使用 sudo 来挂载,但显然umount 命令仍需要 sudo。我需要的是能够在没有 sudo 权限的情况下在 ~/drive_usr 上运行 mount 和 umount。
最初我添加了异步/etc/fstab 中提供的选项之一。然而,这会产生以下错误:
安装错误(22):参数无效
当我运行 dmesg 来查看错误原因时,我发现了以下错误消息:
CIFS: Unknown mount option "async"
那么我理解得对吗?CIFS 不兼容异步? 我想添加异步选项的原因是,当我在谷歌上搜索有关 /etc/fstab 的更多信息时,我看到许多人建议添加此选项以提高性能,作为该领域的初学者,我不知道这是否正确。如果能对此进行澄清,我将不胜感激。
答案1
我按照 wanadium 在评论中提出的建议(非常感谢!)解决了普通用户无法挂载/卸载的问题。以下是必须添加到 /etc/fstab 的行
//remote-usrs-srv/Users$ /home/mylinux_username/drive_usr cifs users,noauto,rw,suid,exec,dev,iocharset=utf8,username=my_windows_username,domain=AD,vers=2.0 0 0