我正在运行一个简单的 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 错误问题)终止自己的会话。