以编程方式为新用户克隆 /etc/skel

以编程方式为新用户克隆 /etc/skel

/etc/skel是将为新用户克隆的文件夹。我们是否有可能定义从/etc/skel文件夹中复制什么的规则?

例如,我正在寻找一种方法,如果创建了一个用户并且该用户属于名为的组A,则克隆/etc/skel文件夹除外/etc/skel/not_for_a.txt。可能吗?

答案1

请注意,该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

答案2

  1. 创建其他skel目录。

    sudo mkdir /etc/skel{A,B}
    
  2. /etc/skel将的内容复制到/etc/skelA

    sudo cp /etc/skel/* /etc/skelA/
    
  3. 定制替代的 skel 目录内容。

  4. adduser没有主目录,但其他设置正常。用适当的设置替换省略号。

    sudo adduser --no-create-home ... bob
    
  5. mkhomedir_helper根据备用主目录创建用户主目录。

    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命令可以运行特定于站点的脚本来执行任何设置,例如删除文件。只要可以接受从完整副本开始,然后删除一些文件,那么这种方法就适合您。

来自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

答案4

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 ...

相关内容