web-dev-qa-db-ja.com

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
3
user114318

Sambaサービス全体を再起動する代わりに、シグナルSIGHUPを送信するだけで、構成ファイルを強制的に再ロードできるはずです。

smbd(8)のマニュアルページから

構成ファイルとそれに含まれるファイルは、変更された場合、毎分自動的に再ロードされます。 SIGHUPをサーバーに送信することで、強制的にリロードできます。構成ファイルを再ロードしても、すでに確立されているサービスへの接続には影響しません。ユーザーがサービスから切断するか、smbdを強制終了して再起動する必要があります。

最後の2つの文は重要です:現在の接続はこれの影響を受けません。

ユーザーの接続を処理する方法は、状況によって大きく異なる場合があります。

  • 接続を積極的に使用している場合は、変更を有効にするためにコンピューターを再起動するように指示する方が簡単な場合があります。そうすれば、彼らが何かの真っ只中にいる場合、彼らは彼らの暇なときにそれをすることができます。

  • 個々のユーザーの場合、接続プロセスを強制終了できます(SIGHUPは機能する可能性がありますが、現時点ではわかりません)。ただし、接続が切断されるため、共有で開いている可能性のあるものをすべて保存および/または閉じるようにすることができます。共有に再度アクセスすると、新しいアクセスで新しい接続が生成されます。 smbstatus を使用して、現在の接続に関する情報を見つけることができます。

  • Sambaを再起動します。これはかなり抜本的なアプローチですが、特定の状況で必要になる場合があります。これにより、現在のすべての接続が強制終了され、新しい接続が確立されます。

  • 待ってください。特定の時間に変更が必要ない場合は、クライアントに自分で接続を再確立させることができます。

3
pferate

私も同じ問題を抱えていると思います。私の場合、グループメンバーシップは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エラーがスローされます。

私はこれをバッチファイルとcronジョブで自動化しました。このようにして、ユーザーはダブルクリック(およびI/Oエラーの問題について読む)を介して自分のセッションを強制終了できます。

0
krissi