Я запускаю простую настройку сервера Samba, где пользователи подключаются к общему ресурсу, который содержит папки для определенных групп пользователей. Папки chmod 2770
, поэтому только пользователи, которые находятся в правильной группе, могут читать / писать в них.
Проблема в том, что если я изменяю членство в группе (т.е. удаляю пользователя из группы / добавляю пользователя в группу; изменения синхронизируются между клиентами и сервером!) Самба не перезагружает автоматически членство в группах для пользователя, поэтому они все еще могут писать в группы что они больше не являются членами и т. д. Мне нужно либо повторно подключиться к общему ресурсу, либо перезапустить самбу, чтобы применить изменения.
Есть ли способ предотвратить групповое кеширование и / или включить перезагрузку членства в группе в самбе?
Мой 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
Вместо того, чтобы перезапускать всю службу Samba, вы можете просто послать ей сигнал, SIGHUP
, чтобы заставить его перезагрузить файл конфигурации.
Из smbd(8)
страница руководства:
Файл конфигурации и все файлы, которые он включает, автоматически перезагружаются каждую минуту, если они меняются. Вы можете принудительно перезагрузить сервер, отправив SIGHUP на сервер. Повторная загрузка файла конфигурации не повлияет на подключения к какой-либо уже установленной службе. Либо пользователю придется отключиться от службы, либо smbd будет убит и перезапущен.
Последние два предложения важны: на текущие соединения это не влияет.
То, как вы управляете подключениями пользователей, может сильно различаться и зависеть от ситуации.
Если они активно используют свое подключение, может быть проще попросить их перезагрузить компьютер, чтобы изменения вступили в силу; таким образом, если они заняты чем-то, они могут просто делать это на досуге.
Для отдельных пользователей вы можете убить их процесс подключения (SIGHUP
может сработать, но пока не уверен); но вы можете захотеть, чтобы они сохранили и / или закрыли все, что они могли открыть на общих ресурсах, потому что их соединение будет разорвано. Когда они снова получат доступ к общему ресурсу, они создадут новое соединение с новым доступом. Ты можешь использовать smbstatus
чтобы найти информацию о текущих подключениях.
Перезапуск 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 с этим проблем нет, потому что переподключается к самбе автоматически. У пользователя будет только минимальная задержка до следующего звонка. Но: все активные передачи файлов будут отменены, и пользователю будет выдана ошибка ввода-вывода.
Я автоматизировал это с помощью пакетного файла и cronjob. Таким образом, пользователь может завершить свои собственные сеансы двойным щелчком (и прочитать о проблеме с ошибкой ввода-вывода).