解析 `/etc/passwd` 来查找 root 用户,以及该用户是否可以运行交互式 shell

解析 `/etc/passwd` 来查找 root 用户,以及该用户是否可以运行交互式 shell

我想要解析/etc/passwd文件来查明用户是否具有 root 权限并可以运行交互式 shell。

根据

UID 100-999 由系统为管理员和系统帐户/组保留

我的理解是,如果 UID 介于 100 和 999 之间,则用户具有 root 权限。我说得对吗?

接下来是您如何说用户可以通过阅读来运行交互式 shell /etc/passwd

PS. 我正在用 python 解析这个文件,我可以实现逻辑,我只是​​不知道如何找出 root 用户以及什么是交互式 shell 以及如何找到它。

答案1

有两种类型的账户:系统账户和普通用户。系统账户属于服务和守护进程,例如lightdmdnsmasq等。通常您无法登录这些账户(尽管有办法)。

bash普通用户(例如您的帐户或其他人的帐户)可以通过 shell(可以是、kshmkshcsh或图形 shell,例如Gnome或)登录并与操作系统交互Unity

系统帐户默认范围为 100 到 999。有一个特殊情况,nobody其 ID 为 65534(这是最大 UID 数)。例如,在我的系统上dnsmasq它运行dnsmasq服务。

普通用户帐户的 UID 范围为 1000 至 65533。这些用户可以登录,除非他们的密码被禁用或其输入的/etc/passwdshell 设置为/usr/sbin/nologin,或以其他方式被阻止。如果这些用户属于sudo组,则可以拥有 root 权限。

因此,如果您想找到具有sudo权限的用户,您需要解析/etc/group文件。这是我的:

$ awk '/sudo/' /etc/group                                      
sudo:x:27:xieerqi,testuser

为了获取用户,请使用:分隔符并打印第 4 个字段。

$ awk -F':' '/sudo/{print $4}' /etc/group                      
xieerqi,testuser

在 python 中这是这样做的:

>>> with open("/etc/group") as file:
...    for lines in file:
...       if lines.__contains__("sudo"):
...          print lines.split(":")[3]

这里有一个更有趣的方法。如果我们想获取所有用户sudo并查看他们是否在 中设置了 shell ,该怎么办/etc/passwd

$ awk -F':' '/sudo/{gsub(/\,/,"\n");print $4 }' /etc/group | xargs -I {} grep '^{}\:.*' /etc/passwd               
xieerqi:x:1000:1000:xieerqi,,,:/home/xieerqi:/bin/mksh
testuser:x:1001:1001:,,,:/home/testuser:/bin/bash

答案2

在 Python 中可以这样做

import grp
import pwd
print([x for x in grp.getgrnam('sudo').gr_mem if pwd.getpwnam(x).pw_shell not in ('/bin/false', '/bin/nologin')])

其中grp.getgrnam('sudo').gr_mem将返回组的所有组成员sudopwd.getpwnam(USER).pw_shell从中返回用户 shell /etc/passwd


但只有 中的组成员身份sudo并不是成为 root 的唯一方式。您的用户还可以拥有 中的单独条目,这将赋予他们 root 权限。因此您也/etc/sudoers需要进行解析。/etc/sudoers

相关内容