Jir*_*i B 4 linux shell users make openbsd
我想要一个 shell 脚本或 makefile 来自动创建新用户。我无法决定哪种方法更好 - 脚本还是 makefile?
我有两种类型或用户 - 两者都是 SFTP chroot、个人帐户和 Web 域的共享帐户。
新用户使用电子邮件地址“注册”,如果域名有效,我会检查 DNS MX 记录,如果用户名是有效收件人,我会检查 RCPT。
然后我不能使用useradd -m,因为它会创建用户拥有的 homedir,但对于 SFTP chroot,它必须是 root 拥有的并且不能由其他任何人写入。因此,我手动创建 dir 和 dir 布局。
我也不能用来userdel -r完全删除这样的用户,因为userdel -r如果 homedir 不属于用户(至少在 OpenBSD 上),则不会删除它。
对于这样的任务,脚本和 makefile 哪个更好?
PS:我不想使用ansible等......
我强烈建议使用脚本而不是 makefile。
简而言之,原因是:
使用 makefile 本质上并不是“错误”,它有它的好处,但也有很多注意事项。无论您做出什么决定,您都应该了解权衡。
让我详细说明一下。
遵循惯例或最小惊讶原则
当我看到脚本时,我认为它会自动执行某些操作。当我看到 makefile 时,我认为它构建了一些东西。当我在你的办公室工作时,我想添加一个用户,我查看文档,它说要运行一个 makefile,一开始我会感到困惑。makefile 会构建我随后用来添加用户的工具吗?我必须检查 makefile 以确保它确实添加了用户。
可维护性和可扩展性
改变发生了。系统发生变化。要求发生变化。工具需要进行调整。以下是我在尝试调整用于自动执行系统管理任务的 makefile 时可以想到的一些注意事项。
排名不分先后:
您必须在配方中的每一行前面添加一个制表符(请参阅makefile 规则语法定义)。也许这只是我个人的烦恼。可以使用一个好的编辑器来克服这个问题,该编辑器可以配置为不使用 makefile 中的空格替换前导制表符。使用.RECIPEPREFIX可以解决此问题,但是您再次打破了普遍的期望。
您无法(轻松)处理 makefile 中的参数。这将使添加像--verboseor--force或 这样的参数变得非常困难--no-action。请参阅此处了解更多说明:/sf/answers/3150218361/
除了上述之外:您无法自定义参数处理错误消息。换句话说:如果用户提供了不正确的参数,您就无法编写有意义的错误消息
您无法(轻松)将通用代码提取到函数中。有“罐头食谱”。但我宁愿不。
您无法(轻松)编写多行 shell 脚本结构,因为 make 会自行执行配方中的每一行。例如if [ condition ]; then commands; fiorfor elements; do commands; done必须写成一行。使用.ONESHELL可以解决此问题
此外,由于上述原因,您无法(轻松)在一行中设置标志并在下面的一行中对该标志进行操作。因为每条线都是独立的。解决方法如上所述。
其他神秘的 makefile 怪癖。例如:
额外问题:你不能将 makefile 放入/usr/bin或中~/bin。无论如何,您都需要编写一个包装脚本。
makefile 旨在自动化构建过程,而不是自动化系统管理任务
使用 makefile 来自动执行系统任务就像使用 git 而不是 rsync 来进行系统备份一样。
Make 是一个功能强大的工具,有很多特点可以自动化构建过程。Git 是一个功能强大的工具,在进行代码版本控制方面有很多特点。如果使用该工具有很大帮助,那么这些怪癖是可以容忍的。但是,如果有其他工具更适合手头的任务,那么为什么要解决用于执行其他任务的工具的怪癖呢?
一些演示:
我能想到的 makefile 的好处是您不需要编写参数处理的样板文件。比较:
生成文件:
useradd:
@echo commands that do the things for useradd
userdel:
@echo commands that do the things for userdel
Run Code Online (Sandbox Code Playgroud)
脚本:
#!/bin/sh
if [ $# == 0 ]; then
echo "need argument: useradd or userdel"
exit 1
fi
if [ "$1" == "useradd" ]; then
echo "commands that do the things for useradd"
elif [ "$1" == "userdel" ]; then
echo "commands that do the things for userdel"
else
echo "unknown argument: $1"
exit 1
fi
Run Code Online (Sandbox Code Playgroud)
但是之后:
$ make userdell
make: *** No rule to make target 'userdell'. Stop.
$ ./script.sh userdell
unknown argument: userdell
Run Code Online (Sandbox Code Playgroud)
您无法自定义错误消息。
$ touch userdel
$ make userdel
make: 'userdel' is up to date.
Run Code Online (Sandbox Code Playgroud)
如果某个名为的文件userdel存在,无论出于何种原因,make 都会正确推断出不需要执行任何操作。