如何在Linux机器上列出可登录活跃用户的邮箱地址?
如何在Linux机器上列出可登录活跃用户的邮箱地址?
嘿,我来帮你搞定这个需求!你已经通过sudo chfn some_user -o some_user@ourdomain.org把邮箱存在/etc/passwd的GECOS字段里了,先确认下你提到的提取邮箱的方法确实可行:
awk -F : '{print $5}' /etc/passwd | awk -F , '{print $5}'
不过你要排除过期账户的话,咱们得结合/etc/shadow文件来处理——毕竟账户过期信息存在这里。下面给你几个实用的方案和需要注意的细节:
核心方案:关联passwd和shadow过滤过期账户
/etc/shadow里的第8个字段是账户过期日期,格式是从1970-01-01开始的天数(空值或99999表示永不过期,0表示已过期)。我们可以用join命令关联/etc/passwd和/etc/shadow,再用awk过滤出未过期的用户,同时提取邮箱:
join -t: /etc/passwd /etc/shadow | awk -F: '$8 == "" || $8 > $(date +%s)/86400 {split($5, gecos, ","); print gecos[5]}'
命令解释:
join -t: /etc/passwd /etc/shadow:按用户名(第一个字段)关联两个文件,把用户的基本信息和密码/过期信息合并到一行$(date +%s)/86400:把当前时间转成从1970年开始的天数,用来和shadow里的过期日期对比split($5, gecos, ","):拆分GECOS字段(/etc/passwd的第5个字段),提取第5个元素就是你设置的邮箱
⚠️ 注意:默认/etc/shadow只有root能读,普通用户执行这个命令会报错,这时候需要加sudo来运行。
更完善的过滤:除了过期日期还要注意这些
除了账户过期,还有几个情况会导致用户无法登录,咱们可以一起过滤掉:
1. 被锁定的账户
/etc/shadow的第二个字段如果以!或*开头,说明账户被锁定,哪怕没过期也不能登录,要排除这类用户。
2. 无登录权限的用户
/etc/passwd的第7个字段(登录shell)如果是/sbin/nologin、/bin/false这类,用户没法登录系统,也应该排除。
3. 系统用户
像root、bin、daemon这类系统用户,UID通常小于1000,一般不需要列入你的列表,也可以过滤掉。
4. 无效邮箱
有些用户可能没设置邮箱,或者GECOS字段格式不对,咱们可以加个判断只输出包含@的有效邮箱。
整合这些条件后的完整命令:
join -t: /etc/passwd /etc/shadow | awk -F: '$3 >= 1000 && $7 !~ /(nologin|false)$/ && $2 !~ /^[!*]/ && ($8 == "" || $8 > $(date +%s)/86400) {split($5, gecos, ","); if (gecos[5] ~ /@/) print gecos[5]}'
关于你提到的其他工具的补充
- 你说的Python
spwd模块确实已经被deprecated了,新版本Python里可以用pwd模块读/etc/passwd,结合crypt模块解析/etc/shadow,但还是需要root权限才能读取shadow文件,用shell命令反而更直接。 chage -l命令确实需要root权限才能查看其他用户的过期信息,这是系统的权限限制,没办法绕开。
备注:内容来源于stack exchange,提问作者lumbric
相关产品推荐
相关产品推荐

