我怎么能列出所有超级用户?

我想要一个命令列出所有拥有root权限的用户即sudo?

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

如果你只需要列出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 

这些命令中的任何一个都将打印/etc/group sudo组中列出的所有用户(如果有)。

命令#1细分:

  • grep :打印与文件中的正则表达式匹配的所有行
  • -P :使grep匹配Perl风格的正则表达式
  • o :使grep只打印匹配的字符串
  • '^sudo.+:\K.*$' :使grep与引号之间的正则表达式匹配

正则表达式#1细分:

  • 未列出的任何字符或字符组都与字符或字符组本身匹配
  • ^ :开始行
  • .+ :一个或多个字符
  • \K :丢弃上一场比赛
  • .* :零个或多个字符
  • $ :行尾

命令#2细分:

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

正则表达式#2细分:

  • 未列出的任何字符或字符组都与字符或字符组本身匹配
  • ^ :开始行
  • .* :零个或多个字符
  • $ :行尾

正如它在这里所说的那样,我考虑使用-l-U选项一起发现的最简单方法,只需键入它将列出的users ,例如: John然后:

如果用户具有sudo访问权限,它将打印该特定用户的sudo访问级别:

  sudo -l -U John User John may run the following commands on this host: (ALL : ALL) ALL 

如果用户没有sudo访问权限,则会打印出不允许用户在localhost上运行sudo

  sudo -l -U John User John is not allowed to run sudo on localhost. 

正如已经说过的那样,答案可以在Unix和Linux Stack Exchange上找到 :

这表明用户“saml”是轮组的成员。

 $ getent group wheel wheel:x:10:saml 

唯一的区别是Ubuntu中的组不是wheel ,而是sudo (或旧版本的Ubuntu中的admin )。 所以命令变成:

 getent group sudo 

扩展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权限的用户列表:

 awk -F ":" '{ system("groups " $1 " | grep -P \"[[:space:]]sudo([[:space:]]|$)\"") }' /etc/passwd 

输出是(例如):

  :  adm cdrom sudo dip plugdev lpadmin sambashare docker 

如果只显示用户名,则此命令为:

 awk -F ":" '{ system("groups " $1 " | grep -P \"[[:space:]]sudo([[:space:]]|$)\"") }' | awk -F ":" '{ print $1 }' /etc/passwd 

在大多数类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)的成员。 但是你的用户和mybrother都是27组的成员,这是组sudo的gid(组标识)号码。 所以mybrother也可以获得root权限(超级用户)。

许多Linux系统,如Fedora和Slackware,都包含了轮组gid = 10。 在应用sudo命令时,它允许管理员权限。 在基于BSD的系统(例如FreeBSD)上,root用户是轮组的成员,它是gid 0。

此外,通过使用id命令,任何用户都可以找到系统中另一个已知用户的组信息。

例如:

 :~$ id mybrother 

样本输出

 uid=1001(mybrother) gid=1001(mybrother) groups=1001(mybrother),24(cdrom),27(sudo),30(dip),46(plugdev),108(lpadmin),124(sambashare)