- 我想在 ubuntu 上创建一个临时用户,该用户会在一定时间内被删除。
- 我可以延长删除时间。
- 我可以获取用户删除之前剩余时间的值。谢谢。
答案1
答案2
遵循你的三点,但分解为更原子的操作:
1. 创建或更新用户
创建具有到期日期的用户,或修改用户。注意:使用YYYY-MM-DD
日期格式。
创建新用户:
sudo useradd -e 2022-12-31 newuser
修改现有用户:
sudo chage --expiredate 2022-12-31 existinguser
2. 查找到期日期
简而言之,整个过程都打包在一个文件中,但下面解释了该过程的关键部分。
chage --list --iso8601 test | grep "Account expires" | sed -s 's/.*:\ //g'
该命令chage
需要 root 权限。iso8601
无论会话中的语言环境如何,该参数都会使日期保持不变。替换sed
所有s
字符,直到第一次出现:
(请注意空格键),这样我们就得到了日期(格式与date '+%F'
命令的输出完全相同)。
3. Chron 自动删除用户
让我们自动化一下。假设文件/root/remove-expired-users.sh
包含以下代码。
#/bin/bash
SOURCEURL='[https://askubuntu.com/questions/1445285/create-a-temporary-users-on-ubuntu]'
LOGFILE='/var/log/messages'
for USERNAME in $(sed 's/\:.*$//g' /etc/passwd); do
echo "`date '+%F_%R'` :: $SOURCEURL :: Testing user -=## $USERNAME ##=- against being expired, for removal." >> $LOGFILE
EXPIRYDATE=`chage --list --iso8601 $USERNAME | grep "Account expires" | sed -s 's/.*:\ //g'`
if [ `date '+%F'` = $EXPIRYDATE ]; then
echo "`date '+%F_%R'` :: $SOURCEURL :: User -=## $USERNAME ##=- expired today. Remove action commented-out for safety." >> $LOGFILE
# deluser $USERNAME
# deluser --group --only-if-empty $USERNAME
fi
done
使/root/remove-expired-users.sh
至少对 root 可执行,添加此行:14 3 * * * /root/remove-expired-users.sh
到 root 的 crontab(此处:)sudo -i crontab -e
,以便在今天凌晨 3:14 删除今天过期的用户(尽管在 23:59 删除它们更有意义)。
评论:
- 列出全部内容并不优雅(也不安全)
/etc/passwd
,但对于学习来说可以。对于产品,此循环将排除 ID 低于 1000 甚至更多的用户(例如管理员)。 - 出于安全考虑,用户删除已被注释掉。请确保在可重新生成的虚拟机上进行测试,否则您就是在自找麻烦。
- 大多数这些操作都需要 root 权限,因此需要在 root 的 cron 上进行配置。此外,(root 的)权力越大,责任越大:拼写错误可能会带来灾难性的后果。
- 如果您的机器在某一天没有运行,那么在脚本运行时,当天到期的用户将不会在系统中删除。这违反了假设,但另一方面他们已经无法登录。
4. 距离到期天数
上面有一个命令可以查看到期日期。到期天数可以通过以下步骤计算:
- 将到期日期和今天的日期转换为自纪元以来的(毫秒)秒数。
- 减去这些。任何非负数(或正数,取决于从什么中减去什么)的数值都符合下一步的条件。
- 进行适当的划分和舍入,以获得距离到期日和小时数。