如何强制 Samba 创建目录

如何强制 Samba 创建目录

我需要Samba配置方面的帮助。

我想要实现的是配置,其中共享上的 Windows 用户只能看到自己的文件。这可以通过以下配置轻松实现:

用户由 Windows AD 服务器授权

[BACKUP]
  comment = BACKUP STORAGE LOCATION
  path = /storage/BACKUP
  read only = no
  browseable = yes
  writable = yes
  create mode = 0600
  directory mode = 0700
  force directory mode = 0700
  force create mode = 0600
  access based share enum = yes
  hide unreadable = yes
  valid users = "@DOMAINNAME+SOMEUSERGROUP"

它运行正常但是...在服务器端,目录中的所有内容都/storage/BACKUP保存着每个用户的文件。

所以我想在这里为每个用户创建目录(我不能使用 [home],因为它已经被使用了)

所以我想保持这样:

/storage/BACKUP/username/

因此,当我改变路径并%U在末尾添加时,一切几乎都正常。

问题是我需要手动创建目录/storage/BACKUP/username

因此我需要以某种方式Samba在用户访问此共享之前强制创建此目录。

我尝试添加add user script = /path/to/mkdir /storage/BACKUP/%U 但这不起作用,因为:

  1. 我不知道为什么;)
  2. 我之前已经有用户登录过
  3. 它应该为新创建的用户启动,这对我来说没问题,但它不起作用。

我不会在 Linux 中创建用户,在他们登录后,所以我不会在其他任何地方使用添加用户/机器脚本。

因此,当该用户尝试连接时,我想强制Samba为该用户创建目录。我在 Google 上搜索了几个小时,但没找到适合我的方法。

我需要为每个人保留 /server/BACKUP 位置,但在服务器端,需要将文件保存在每个用户单独的目录中,因此创建新的共享也不是解决方案。

答案1

您可以使用preexecroot preexec选项来实现这一点。它们指定在连接到共享时运行的脚本。如果是,则以preexec连接用户身份运行共享,如果是,则以 root 身份运行共享root preexec

在您的分享中:

[BACKUP]
root preexec = /etc/samba/gendir.sh %u

看起来/etc/samba/gendir.sh有点像这样:

#!/bin/bash 
DIRECTORY=/storage/BACKUP/$1
if [ ! -d "$DIRECTORY" ]; then
   mkdir $DIRECTORY
fi

根据您的要求,在脚本中添加chown和/或语句。chmod

答案2

就我而言,情况略有不同 - 我使用 Samba 作为我的 FreeNAS 的 DC。我不确定这是由于 FreeBSD 构建还是 Samba 作为 DC,但无论如何,@ 中的脚本用户名斯文上述回答在前面添加了域名,因此 $1 最终是 DOMAINuser 而不是 user,并且主共享请求的目录是 DOMAIN\user 而不仅仅是 user。

我已经像这样调整了脚本,现在它运行得很好:

#!/bin/bash

USERNAME="${1//DOMAIN/}"

DIRECTORY=/mnt/tank/domain-homes/DOMAIN/$USERNAME

if [ ! -d $DIRECTORY ]; then
    mkdir -p $DIRECTORY
    chown DOMAIN\\$USERNAME:wheel $DIRECTORY
fi

此外,机器还会尝试创建自己的目录,并以 _ 字符结尾。用户名中有一个 $ 来表示计算机帐户。我已将脚本修改如下以支持计算机目录:

#!/bin/bash

USERNAME="${1//DOMAIN/}"

DIRECTORY=/mnt/tank/domain-homes/DOMAIN/$USERNAME

if [[ "$USERNAME" == *_ ]]
then
    # We have a computer share, so the username has a $ at the end,
    # the folder retains the _
        USERNAME="${USERNAME//_/\$}"
fi

if [ ! -d $DIRECTORY ]; then
    mkdir -p $DIRECTORY
    chown DOMAIN\\$USERNAME:wheel $DIRECTORY
fi

我也打算以同样的方式创建配置文件目录。

答案3

这是独立服务器。在共享辅助参数中我添加了:

root preexec = bash -c '[[ -d /mnt/NAS/SAMBA/scratch/%U ]] || mkdir -m 0700 /mnt/NAS/SAMBA/scratch/%U && chown %U:%G /mnt/NAS/SAMBA/scratch/%U'

所有用户都有权访问临时文件并完全控制所有文件,但是每个用户都会自动创建自己的目录。

答案4

如果您使用 PAM 机制,您可能需要将以下行添加到文件
/etc/pam.d/common-session:

session required        pam_mkhomedir.so skel=/etc/skel umask=0077

相关内容