Answers:
如果您只需要列出sudo
组中列出的sudoers ,我认为最好的方法是运行此命令(此命令在计算上应比此答案中的任何其他命令轻):
grep -Po '^sudo.+:\K.*$' /etc/group
另外,正如muru的评论中所建议的那样,条目的格式/etc/group
可以通过以下方式轻松处理cut
:
grep '^sudo:.*$' /etc/group | cut -d: -f4
同样,正如muru的评论所建议的,可以getent
代替以下内容使用grep
:
getent group sudo | cut -d: -f4
这些命令中的任何一个都将打印sudo
组中列出的所有用户/etc/group
(如果有)。
命令#1故障:
grep
:打印文件中与正则表达式匹配的所有行-P
:使grep
Perl风格的正则表达式匹配o
:使grep
仅打印匹配的字符串'^sudo.+:\K.*$'
:使grep
引号之间的正则表达式匹配正则表达式1细分:
^
:行首.+
:一个或多个字符\K
:舍弃先前的比赛.*
:零个或多个字符$
: 行结束命令#2故障:
grep
:打印文件中与正则表达式匹配的所有行'^sudo.+:\K.*$'
:使grep
引号之间的正则表达式匹配cut
:仅打印文件中每行的指定部分-d:
:使cut
解释:
为字段定界符-f4
:cut
仅打印第四个字段正则表达式2的细分:
^
:行首.*
:零个或多个字符$
: 行结束getent group sudo | cut -d: -f4
,或使用awk,但无论哪种方式,请记住group和passwd具有固定的格式,带有分隔符。
getent group
-完全不需要grep。getent group foo
就像grep foo /etc/group
,但能力更强。
getent
,如何比较grep
和getent
计算比较困难?跑步会更轻松getent
吗?
sudo
组的成员。某些unix具有其他组,例如wheel
。通过@muru答案将包括所有的sudoers不管他们是在什么组。
正如这里所说的,我认为用-l
&-U
选项一起发现的最简单方法,只需键入users
它将列出例如:John
然后:
如果用户有权sudo
访问,它将打印该sudo
特定用户的访问级别:
sudo -l -U John
User John may run the following commands on this host:
(ALL : ALL) ALL
如果该用户没有sudo访问权限,它将显示不允许该用户sudo
在localhost 上运行:
sudo -l -U John
User John is not allowed to run sudo on localhost.
for u in $(awk -F'[/:]' '{if($3>=1000&&$3!=65534) print $1}' /etc/passwd); do sudo -lU "$u" ; done
。快速破解没有任何保证:)
"%domain admins@mycompany.intra" ALL=(ALL) ALL
则可以正常工作。您节省了我很多时间,因为我没有意识到这也适用于非本地用户。
如前所述,答案可以在Unix&Linux Stack Exchange上找到:
这表明用户“ saml”是wheel组的成员。
$ getent group wheel wheel:x:10:saml
唯一的区别是,Ubuntu中的组不是wheel
,而是sudo
(或admin
在旧版本的Ubuntu中)。因此,命令变为:
getent group sudo
geten group
,而且看到了很多不同的数字。我最初的问题是,如何确定用户是否是系统用户(使用创建useradd -r
)
在大多数类似Unix的系统上,它们具有sudo命令和sudo配置文件。以root身份运行visudo:
:~$ sudo bash
要么
:~$ su
:~# visudo
将允许管理员检查和修改可以使用sudo命令的组的特权。
在基于Debian的类Unix系统(如Ubuntu)上,组4和27通常具有sudo特权的访问权限。
组4是管理员组(adm),组27是sudo gid。
要查看当前分配给这些组的用户,请在/ etc / group文件中添加目录,如下所示:
:~$ cat /etc/group
在Ubuntu(但不是基于Redhat,基于Oracle Solaris / Solaris或基于BSD的系统上)上的示例输出将产生以下结果:
adm:x:4:youruser
tty:x:5:
disk:x:6:
lp:x:7:
mail:x:8:
news:x:9:
uucp:x:10:
man:x:12:
proxy:x:13:
kmem:x:15:
dialout:x:20:
fax:x:21:
voice:x:22:
cdrom:x:24:youruser,mybrother
floppy:x:25:
tape:x:26:
sudo:x:27:youruser,mybrother
可以知道,您的用户是系统管理员,也是组4(adm)的成员。但是youruser和mybrother都是第27组的成员,这是sudo组的gid(组标识)号。因此,mybrother也可以获取root特权(超级用户)。
许多Linux系统(例如Fedora和Slackware)都结合了轮组gid = 10。当应用sudo命令时,它允许管理员特权。在基于BSD的系统(例如FreeBSD)上,root用户是gid 0的wheel组的成员。
同样,通过使用id命令,任何用户都可以找到系统中另一个已知用户的组信息。
例如:
:~$ id mybrother
样品输出
uid=1001(mybrother) gid=1001(mybrother) groups=1001(mybrother),24(cdrom),27(sudo),30(dip),46(plugdev),108(lpadmin),124(sambashare)
此命令返回具有sudo权限的用户列表:
awk -F ":" '{ system("groups " $1 " | grep -P \"[[:space:]]sudo([[:space:]]|$)\"") }' /etc/passwd
输出为(例如):
<username> : <username> adm cdrom sudo dip plugdev lpadmin sambashare docker
如果仅显示用户名,那么此命令:
awk -F ":" '{ system("groups " $1 " | grep -P \"[[:space:]]sudo([[:space:]]|$)\"") }' | awk -F ":" '{ print $1 }' /etc/passwd
命令:
cat /etc/group | grep sudo
输出:
sudo:x:27:Tom,Stacy
汤姆,史黛西是具有sudo特权的用户。
cat
。