программно клонировать / etc / skel для новых пользователей


11

/etc/skelпапка, которая будет клонирована для новых пользователей. Есть ли возможный способ определить правила для копирования из /etc/skelпапки?

Например, я ищу способ, которым, если пользователь создан и принадлежит к группе с именем A, /etc/skelкроме папки клонов /etc/skel/not_for_a.txt. Возможно?

Ответы:


11

Обратите внимание, что useraddкоманда позволяет вам указать пользовательский каталог SKEL, используя эту -kопцию. Вы можете создать каталог / etc / skel-for-group-A без not-for-a.txt, а затем добавить новых пользователей со своей группой по умолчанию как A и указать их каталог SKEL с помощью команды:

useradd username -g groupA -k /etc/skel-for-group-A -m

См. Http://manpages.ubuntu.com/manpages/trusty/man8/useradd.8.html.


1
useraddне рекомендуется для систем на основе Debian на странице руководства в моей системе 16.04. Если причина этого предостережения изменилась, добавьте его в свой ответ. Также на 16.04 useraddи adduserнаходятся разные программы с разными опциями, возможно, вы могли бы отредактировать свой ответ для ясности.
Дж.

8
@ J.Starnes Указывать пользовательский каталог SKEL невозможно в adduserкоманде, поэтому мы используем useradd. Это не совсем обескураживает: « useraddэто утилита низкого уровня для добавления пользователей. В Debian администраторы обычно должны использовать adduserвместо этого». Можно использовать эту команду при необычных обстоятельствах, подобных этому.
Мукеш Сай Кумар

8
  1. Создайте дополнительные skelкаталоги.

    sudo mkdir /etc/skel{A,B}
    
  2. Скопируйте содержимое /etc/skelв /etc/skelA.

    sudo cp /etc/skel/* /etc/skelA/
    
  3. Настройте альтернативное содержимое каталога skel.

  4. adduserбез homedir, но с другими нормальными настройками. Замените многоточие соответствующими настройками.

    sudo adduser --no-create-home ... bob
    
  5. mkhomedir_helper для создания пользователей homedir на основе альтернативных skel dir.

    sudo mkhomedir_helper bob /etc/skelA
    
#!/bin/bash
### a bare bones dumb script to create a user with a homedir based on an alternitive skeldir
adduseropt="--no-create-home --ingroup"
# assumes $1 will be user TODO add sanity check
# Assumes $2 will be alternitive skeldir TODO add sanity check
# assumes $3 will be a group TODO add sanity check
sudo adduser --no-create-home $adduseropt $3 $1
sudo mkhomedir_helper $1 $2

3

adduserдействительно поддерживает ограниченный способ исключения файлов из директории скелета. От man adduser.conf:

SKEL_IGNORE_REGEX
    Files  in  /etc/skel/  are  checked  against this regex, and not
    copied to the newly created home directory if they match.   This
    is  by default set to the regular expression matching files left
    over from unmerged config files (dpkg-(old|new|dist)).

Хотя вы не можете установить это регулярное выражение из командной строки, вы можете установить используемый конфигурационный файл, используя --confопцию. Таким образом, вы можете создавать дополнительные копии, /etc/adduser.confкоторые отличаются только от SKEL_IGNORE_REGEX, и использовать их:

(grep -v '^SKEL_IGNORE_REGEX' /etc/adduser.conf; printf "%s\n" 'SKEL_IGNORE_REGEX="not_for_a.txt"') > /etc/adduser_A.txt
sudo adduser --conf /etc/adduser_A.txt ...

3

Команда adduserможет запустить специфичный для сайта сценарий, чтобы выполнить любую настройку, например удаление файлов. Если допустимо начинать с полной копии, а затем удалять некоторые файлы, тогда этот подход может работать для вас.

Со страницы руководства adduser (8) :

Если файл /usr/local/sbin/adduser.local существует, он будет выполнен после того, как учетная запись пользователя была настроена для выполнения любой локальной настройки. Переданные аргументы adduser.local:

имя пользователя uid gid home-directory

Поэтому все, что вам нужно сделать, это написать скрипт, который принимает четыре параметра и использовать его для удаления любых файлов, которые вам нужны. Сохраните его как /usr/local/sbin/adduser.localи убедитесь, что он помечен как исполняемый ( chmod a+x).

Вот кое-что, чтобы вы начали:

#!/bin/bash
## Site-specific setup for newly-created users.
## adduser(8) will call this script after setting up a new user.

set -euo pipefail
if [[ "$#" != 4 ]]; then
  echo "usage: $0 username uid gid home" > /dev/stderr
fi
NEW_USERNAME="${1:?}"
NEW_UID="${2:?}"
NEW_GID="${3:?}"
NEW_HOME="${4:?}"

# The groups command outputs a space-separated list of group names
IFS=' '
for group in $(groups "${NEW_USERNAME}"); do
   case "${group}" in
     a)
       [[ "${VERBOSE}" > 0 ]] && echo Removing file for a
       rm "${NEW_HOME}/not_for_a.txt"
       ;;
     b)
       [[ "${VERBOSE}" > 0 ]] && echo Removing dir for b
       rm -r "${NEW_HOME}/not_for_b/"
       ;;
     *)
       [[ "${VERBOSE}" > 1 ]] && echo No special setup required for $group
       ;;
   esac
done

Интересная часть, которую вы хотите отредактировать, это строки, которые выглядят так:

     a)
       [[ "${VERBOSE}" > 0 ]] && echo Removing file for a
       rm "${NEW_HOME}/not_for_a.txt"
       ;;

Вы можете ввести фактическое имя группы и поведение, которое вы хотели бы видеть вместо a)и rm not_for_a.txt.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.