如何检查 Linux 中的 /etc/passwd 文件是否包含无效条目?

How to check if the /etc/passwd file in Linux contains invalid entry?

我正在尝试使用 pwck 命令确定 Linux 中位置 /etc/passwd 中的 passwd 文件是否包含任何无效数据条目。

例如:
1) 如果我的文件包含此条目,该条目由于末尾的额外冒号而无效 - user1:x:1000:1000:user1,:/home/user1:/bin/bash:

sudo pwck -r /etc/passwd

This takes a no by default if invalid entries exist and shows other output as well

2) 如果我的 passwd 文件在语法上是正确的,但有用户没有对应的目录

sudo pwck -r /etc/passwd

user 'user1': directory '/var/xyz' does not exist

这两个命令的退出值都是 2,所以我无法区分用户输入是否无效,或者是否存在不存在的用户目录

我只想识别 passwd 文件中的无效条目,即文件中是否有一些额外的字符或语法错误添加的条目

如果你只想要 "syntatic" 正确性,只需编写一个正则表达式来匹配它。从 wikipedia and shadow sources 读取以正确匹配用户名,我为 GNU sed 写了这个:

sed -r '/^[a-z_][a-z0-9_-]*[$]?:[^:]*:[0-9]+:[0-9]+:[^:]*:[^:]*:[^:]*$/!q1'

但是有 many other 项检查 pwck 执行。

所以我认为最好的方法是获取 pwck 来源并手动选择您感兴趣的支票并删除 the checks 您不感兴趣的支票。

so I cannot distinguish

当然你可以区分 - 因为程序输出文件有什么问题。

if ! out=$(sudo pwck -r /etc/passwd 2>&1); then
   if <<<"$out" grep -q 'invalid user name\|invalid user ID\|invalid password file entry'; then
       echo "File is syntactically wrong"
   else
        echo "Something else is wrong with the file"
   fi
fi