在没有桌面的 RHEL7 上以非 root 用户身份挂载 CIFS 共享

sve*_*ven 5 rhel d-bus centos gvfs cifs

我们有一个 RHEL/CentOS 7 服务器已加入的 Windows (AD) 域 (SSSD/realmd)。用户使用他们的 AD 凭据通过 SSH 登录到服务器。现在用户应该能够在 RHEL 服务器上挂载他们的一些 Windows 共享。但是,我想避免授予所有用户对 (u)mount 的 sudo 权限并为 (u)mount 设置 SUID 标志。

我发现了gvfs-mount似乎是我需要的命令,所以我继续安装了必要的软件包。由于应用程序需要访问会话 DBus,因此DBUS_SESSION_BUS_ADDRESS需要导出该变量。为了能够启动 DBus-Daemon ( dbus-launch),我安装了这个dbus-x11包。

运行命令

export $(dbus-launch)
gvfs-mount smb://DOMAIN\;USER@HOST/SHARE
Run Code Online (Sandbox Code Playgroud)

成功挂载共享。

我最初的想法是将第一行放入.bash_profile. 但是,该解决方案存在两个主要问题:

  1. 每次有人登录时,dbus-daemon都会创建一个不会在注销时终止的新实例。更糟糕的是,该软件包dbus-x11安装了/etc/X11/xinit/xinit.rc.d/00-start-message-bus.sh每次登录时已经启动一个实例的脚本,但是如何获取地址变量?
  2. 如果用户忘记卸载共享,则无法在以后登录时卸载,因为地址变量未知。

理想情况下,dbus-daemon应该在登录时启动,并且应该导出地址变量。当 SSH 会话终止(注销是可选的)时,所有仍然挂载的共享都应该被卸载,并且守护进程应该被终止。我如何以优雅的方式实现这一目标?

相关,但旧的,基本上没有回答:在登录会话中重用 D-Bus 会话

jsb*_*ngs 2

我没有使用gvfs-mount真正用于图形登录的 ,而是使用 autofs 成功完成了此操作。

我在 /etc/auto.master.d/ 中有一个名为 winhome.autofs 的 autofs 配置文件(它必须以 .autofs 结尾),它看起来像这样:

/winhome -fstype=cifs,sec=krb5,uid=&,user=&,cruid=& ://sharename/&
Run Code Online (Sandbox Code Playgroud)

只要您设置了 sssd 来获取 kerberos 票证,当用户打开该目录(使用图形应用程序或通过 shell)时,它就会使用该票证自动挂载卷 \sharename\username。