Как заставить 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Но это не работает, потому что:

  1. Я не знаю почему;)
  2. У меня уже есть пользователи, вошедшие в систему раньше
  3. Это должно начаться для новых созданных пользователей, это будет хорошо для меня, но это не работает.

Я не создаю пользователей в 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

Я намерен также создать каталоги профилей таким же образом.

Другие вопросы по тегам