Samba 不重新加载用户组成员

Samba 不重新加载用户组成员

我正在运行一个简单的 samba 服务器设置,用户连接到一个共享,其中包含特定用户组的文件夹。这些文件夹是chmod 2770,因此只有正确组中的用户才能读取/写入它们。

问题是,如果我更改组成员身份(即从组中删除用户/将用户添加到组;客户端和服务器之间的更改同步!)samba 不会自动为用户重新加载组成员身份,因此他们仍然可以写入他们不再是其成员的组等。我必须重新连接到共享或重新启动 samba 以应用更改。

有什么方法可以防止组缓存和/或在 Samba 中启用组成员身份重新加载?

我的smb.conf:

[global]
interfaces = ethlan
bind interfaces only = yes
smb ports = 445
workgroup = WORKGROUP
security = user
passdb backend = tdbsam:/var/lib/mysamba/samba.tdb

disable netbios = yes
nt acl support = no
invalid users = root
read only = no
case sensitive = yes
load printers = no
unix extensions = yes

log file = /var/log/samba.log
log level = 1
syslog = 0

use sendfile = yes

[groups]
path = /home/groups
browseable = yes
force create mode = 0770
force directory mode = 2770
hide unreadable = yes

答案1

您不需要重新启动整个 Samba 服务,只需向其发送信号,SIGHUP强制其重新加载配置文件。

来自smbd(8)手册页

配置文件及其包含的任何文件如果发生变化,每分钟都会自动重新加载。您可以通过向服务器发送 SIGHUP 来强制重新加载。重新加载配置文件不会影响与已建立的任何服务的连接。用户必须断开与服务的连接,或者终止并重新启动 smbd。

最后两句很重要:当前连接不受此影响。

处理用户的连接的方式可能会有很大差异,并且取决于具体情况。

  • 如果他们正在积极使用他们的连接,那么可能更容易告诉他们重新启动计算机以使更改生效;这样,如果他们正在做某事,他们就可以在闲暇时做这件事。

  • 对于个人用户,您可以终止他们的连接进程(SIGHUP可能有效,但我目前不确定);但您可能希望让他们保存和/或关闭他们在共享上打开的任何内容,因为他们的连接将被切断。当他们再次访问共享时,他们将使用新的访问权限生成新连接。您可以使用smbstatus查找有关当前连接的信息。

  • 重新启动 Samba。这是一个相当激进的方法,但在某些情况下可能需要这样做。这将终止所有当前连接,迫使它们建立新连接。

  • 等待。如果在特定时间不需要更改,您可以让客户端自行重新建立连接。

答案2

我认为我也有同样的问题。在我的例子中,组成员身份被缓存到每个 samba 会话进程中smbstatus -p

我使用这个脚本来终止进程并“刷新”会员信息:

#/bin/sh

VICTIM="$1"

[ -z "$VICTIM" ] && exit 1

if [ "$VICTIM" = "!" ]; then
    L="$(smbstatus -p 2>/dev/null)"
else
    L="$(smbstatus -p -u "${VICTIM}" 2>/dev/null)"
fi

echo "$L" | while read PID USER GROUP CLIENT IP; do
    getent passwd "$USER" >/dev/null || continue

    kill "$PID" 2>/dev/null
    echo -n .
done
echo " done!"

Windows 对此没有问题,因为它会自动重新连接到 samba。用户在下次调用之前只会有极小的延迟。但:所有活动文件传输将被取消并向用户抛出 I/O 错误。

我使用批处理文件和 cronjob 自动执行此操作。这样,用户可以通过双击(并阅读有关 I/O 错误问题)终止自己的会话。

相关内容