![以编程方式为新用户克隆 /etc/skel](https://linux22.com/image/897769/%E4%BB%A5%E7%BC%96%E7%A8%8B%E6%96%B9%E5%BC%8F%E4%B8%BA%E6%96%B0%E7%94%A8%E6%88%B7%E5%85%8B%E9%9A%86%20%2Fetc%2Fskel.png)
/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
创建其他
skel
目录。sudo mkdir /etc/skel{A,B}
/etc/skel
将的内容复制到/etc/skelA
。sudo cp /etc/skel/* /etc/skelA/
定制替代的 skel 目录内容。
adduser
没有主目录,但其他设置正常。用适当的设置替换省略号。sudo adduser --no-create-home ... bob
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
命令可以运行特定于站点的脚本来执行任何设置,例如删除文件。只要可以接受从完整副本开始,然后删除一些文件,那么这种方法就适合您。
如果文件
/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 ...