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


11

/etc/skel是将为新用户克隆的文件夹。有没有一种可能的方法可以定义规则,以便从/etc/skel文件夹复制内容?

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

Answers:


11

注意,该useradd命令允许您使用该-k选项指定自定义SKEL目录。您可以创建一个不带/ 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在我的16.04系统的手册页中不建议使用基于debian的系统。如果更改此警告的原因,您可以将其添加到答案中。同样在16.04上,useradd并且adduser是具有不同选项的不同程​​序,也许您可​​以为清楚起见而编辑答案。
J. Starnes

8
@ J.Starnes无法在adduser命令中指定自定义SKEL目录,因此我们使用useradd。并不完全不建议这样做:“ useradd是用于添加用户的低级实用程序。在Debian上,管理员通常应该使用它adduser。” 在这样的异常情况下可以使用此命令。
Mukesh Sai Kumar

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 根据替代的skel目录创建用户homedir。

    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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.