програмно клонувати / 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 на сторінці man на моїй системі 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 домашній каталог

Тому все, що вам потрібно зробити, - це написати скрипт, який бере чотири параметри, і використовуйте його для видалення будь-яких потрібних вам файлів. Збережіть його як /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.