我想获取允许登录的所有用户的邮件地址列表。我怎样才能做到这一点?
我已经/etc/passwd
使用GECOS 字段设置了邮件地址,即 via 。sudo chfn some_user -o [email protected]
这可以使用 awk 来完成:
awk -F : '{print $5}' /etc/passwd | awk -F , '{print $5}'
但是,我想排除帐户已过期的用户。
用户过期信息存储在/etc/shadow
. 有 Python 模块spwd,但它已被弃用,并且它的后继者似乎无法检查帐户是否仍然有效。
该命令chage -l my_user
显示到期日期,但需要 root 权限才能获取其他用户的信息,即使每个人都可以读取影子文件。
除了保质期外,还有什么需要注意的吗?
我发现了一种有点脆弱的方法,但它有点有效:
警告:上面的命令可能无法在每种情况下执行正确的操作!
它使用此 SO 答案中的 awk 命令打印出 GECOS 信息并将其与 join 结合起来,因此我们可以同时使用来自 passwd 和 Shadow 的信息:行在第一列处匹配(
-t:
指定:
用作分隔符) ),因此使用用户名来匹配文件。在连接文件中,第 13 列是 GECOS 信息,仅当第 8 列为空时才会打印该信息。第 8 列包含帐户到期信息。陷阱:
join: /etc/shadow:38: is not sorted: [...]
。我还没有弄清楚如何在没有临时文件的情况下解决这个问题: join 的手册页建议在将文件传递给 join 之前对文件进行排序,但显然使用 stdin 只能传递一个文件,因此需要临时文件。ChatGPT 为我编写了一个合适的脚本,它比 bash 一行代码效果更好: