我想要解析/etc/passwd
文件来查明用户是否具有 root 权限并可以运行交互式 shell。
根据
UID 100-999 由系统为管理员和系统帐户/组保留
我的理解是,如果 UID 介于 100 和 999 之间,则用户具有 root 权限。我说得对吗?
接下来是您如何说用户可以通过阅读来运行交互式 shell /etc/passwd
?
PS. 我正在用 python 解析这个文件,我可以实现逻辑,我只是不知道如何找出 root 用户以及什么是交互式 shell 以及如何找到它。
答案1
有两种类型的账户:系统账户和普通用户。系统账户属于服务和守护进程,例如lightdm
、dnsmasq
等。通常您无法登录这些账户(尽管有办法)。
bash
普通用户(例如您的帐户或其他人的帐户)可以通过 shell(可以是、ksh
、mksh
、csh
或图形 shell,例如Gnome
或)登录并与操作系统交互Unity
。
系统帐户默认范围为 100 到 999。有一个特殊情况,nobody
其 ID 为 65534(这是最大 UID 数)。例如,在我的系统上dnsmasq
它运行dnsmasq
服务。
普通用户帐户的 UID 范围为 1000 至 65533。这些用户可以登录,除非他们的密码被禁用或其输入的/etc/passwd
shell 设置为/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
将返回组的所有组成员sudo
并pwd.getpwnam(USER).pw_shell
从中返回用户 shell /etc/passwd
。
但只有 中的组成员身份sudo
并不是成为 root 的唯一方式。您的用户还可以拥有 中的单独条目,这将赋予他们 root 权限。因此您也/etc/sudoers
需要进行解析。/etc/sudoers