You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 06:59:31