如何列出所有超级用户?


86

我想要一个命令列出所有具有root特权的用户,即sudo?

假设我是一个临时用户。我怎么知道所有其他sudoer用户?



1
我发现这是一个不错的unix.stackexchange.com/questions/50785/…–
JoKeR

@JoKeR很好而且很棘手
Maythux

1
请注意,只有Jokermuru的答案是正确的,只有解析用户/组conf文件不会提供具有sudo权限的人,没有权限的人。...如果用户在sudo组中,但sudoers文件中未提及sudo组,然后?
heemayl

Answers:


81

如果您只需要列出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:使grepPerl风格的正则表达式匹配
  • o:使grep仅打印匹配的字符串
  • '^sudo.+:\K.*$':使grep引号之间的正则表达式匹配

正则表达式1细分:

  • 未列出的任何字符或一组字符都与该字符或一组字符本身匹配
  • ^:行首
  • .+:一个或多个字符
  • \K:舍弃先前的比赛
  • .*:零个或多个字符
  • $: 行结束

命令#2故障:

  • grep:打印文件中与正则表达式匹配的所有行
  • '^sudo.+:\K.*$':使grep引号之间的正则表达式匹配
  • cut:仅打印文件中每行的指定部分
  • -d::使cut解释:为字段定界符
  • -f4cut仅打印第四个字段

正则表达式2的细分:

  • 未列出的任何字符或一组字符都与该字符或一组字符本身匹配
  • ^:行首
  • .*:零个或多个字符
  • $: 行结束

5
-1:这不会捕获可能已添加到sudoer或LDAP之类的外部源的其他用户或组,而boy是这样做的丑陋方法。getent group sudo | cut -d: -f4,或使用awk,但无论哪种方式,请记住group和passwd具有固定的格式,带有分隔符。
muru

@muru你说得对,我更新了我的答案
科斯

@kos还请注意,您确实应该使用getent group-完全不需要grep。getent group foo就像grep foo /etc/group,但能力更强。
muru

@muru我一点都不知道getent,如何比较grepgetent计算比较困难?跑步会更轻松getent吗?
kos 2015年

1
该答案假定所有sudoer均为该sudo组的成员。某些unix具有其他组,例如wheel。通过@muru答案将包括所有的sudoers不管他们是在什么组。
西蒙·伍德赛德

30

正如这里所说的我认为用-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.

2
您可以遍历所有普通用户并使用如下命令返回有关他们的详细信息:for u in $(awk -F'[/:]' '{if($3>=1000&&$3!=65534) print $1}' /etc/passwd); do sudo -lU "$u" ; done。快速破解没有任何保证:)
Wilf 2015年

这也可以在活动目录设置中使用。例如,您可以从某个特殊组中选择一个用户并检查该用户。如果您正确添加了AD组,"%domain admins@mycompany.intra" ALL=(ALL) ALL则可以正常工作。您节省了我很多时间,因为我没有意识到这也适用于非本地用户。
亚当·卡利斯兹(AdamKalisz)'17年

14

如前所述,答案可以在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
Shayan

9

sudo -l -U测试上进行扩展,可以getent passwd用来确定可以使用的用户sudo。使用getent允许我们访问文件中可能不存在的passwd用户,例如LDAP用户:

getent passwd | cut -f1 -d: | sudo xargs -L1 sudo -l -U | grep -v 'not allowed'

sudo -U 不会返回我们可以利用的非零退出值,因此我们只能精简输出。


这是最好的答案,因为它不假定存在名为的组sudo
西蒙·伍德赛德

3

在大多数类似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)

我特意登录以支持你。完美的解释:)
Vidor Vistrom

1

此命令返回具有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

1
它显示的用户多于sudoers。它需要进行一些修改
Maythux

@NewUSer更好吗?
AB

好多了。政府工作
Maythux 2015年

1

命令:

cat /etc/group | grep sudo

输出:

sudo:x:27:Tom,Stacy

汤姆,史黛西是具有sudo特权的用户。


1
欢迎来到Ask Ubuntu!只是让您知道,这是对的无用用法cat
David Foerster

0

我难倒关于如何vagrant用户可以使用sudo即使没有被提及/etc/sudoers,也没有在/etc/group,也不符合中发现getent

原来sudo还从中的所有文件读取条目/etc/sudoers.d/。因此,如果您没有浏览该目录,则可能不会意识到实际上有多少用户可以sudo访问。

sudo可以通过JoKeR的答案使用来检测这种访问,sudo -l -U vagrant但是此处所有其他依赖于getent或的答案都无法检测到这种访问/etc/group

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.