我需要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
但这不起作用,因为:
- 我不知道为什么;)
- 我之前已经有用户登录过
- 它应该为新创建的用户启动,这对我来说没问题,但它不起作用。
我不会在 Linux 中创建用户,在他们登录后,所以我不会在其他任何地方使用添加用户/机器脚本。
因此,当该用户尝试连接时,我想强制Samba
为该用户创建目录。我在 Google 上搜索了几个小时,但没找到适合我的方法。
我需要为每个人保留 /server/BACKUP 位置,但在服务器端,需要将文件保存在每个用户单独的目录中,因此创建新的共享也不是解决方案。
答案1
您可以使用preexec
或root 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