Как заставить Samba создать каталог
Мне нужна помощь с Samba
конфигурации.
Чего я хочу добиться, так это конфигурации, при которой пользователь Windows на общем ресурсе видит только свои файлы. Это просто достигается с помощью такой конфигурации:
Пользователи авторизованы Windows AD Server
[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 для всех, но на стороне сервера. Необходимо хранить файлы в отдельных каталогах для каждого пользователя, поэтому создание нового общего ресурса также не является решением.
4 ответа
Вы можете использовать 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
заявления к сценарию.
Если вы используете механизм PAM, возможно, вы захотите добавить в файл
/etc/pam.d/common-session следующую строку:
session required pam_mkhomedir.so skel=/etc/skel umask=0077
Это автономный сервер. В дополнительный параметр общего доступа я добавил:
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'
Все пользователи имеют доступ к царапинам и полный контроль над всеми файлами, однако у каждого пользователя автоматически создается свой собственный каталог.
В моем случае ситуация немного другая — я использую Samba в качестве DC с FreeNAS. Я не уверен, связано ли это со сборкой FreeBSD или с Samba как DC, но в любом случае имя пользователя к сценарию в ответе @ Sven выше добавляет имя домена, поэтому $1 в конечном итоге оказывается DOMAINuser, а не пользователем, а запрошенный каталог домашним общим ресурсом является DOMAIN\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
Я намерен также создать каталоги профилей таким же образом.