Answers:
注意,该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
adduser
命令中指定自定义SKEL目录,因此我们使用useradd
。并不完全不建议这样做:“ useradd
是用于添加用户的低级实用程序。在Debian上,管理员通常应该使用它adduser
。” 在这样的异常情况下可以使用此命令。
创建其他skel
目录。
sudo mkdir /etc/skel{A,B}
将的内容复制/etc/skel
到/etc/skelA
。
sudo cp /etc/skel/* /etc/skelA/
自定义备用skel目录内容。
adduser
没有homedir,但具有其他常规设置。用适当的设置替换省略号。
sudo adduser --no-create-home ... bob
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
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 ...
该adduser
命令可以运行特定于站点的脚本以执行任何设置,例如删除文件。只要可以从完整副本开始,然后再删除一些文件,则此方法可能对您有用。
如果文件
/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
。
useradd
在我的16.04系统的手册页中不建议使用基于debian的系统。如果更改此警告的原因,您可以将其添加到答案中。同样在16.04上,useradd
并且adduser
是具有不同选项的不同程序,也许您可以为清楚起见而编辑答案。