我怎么能列出所有超级用户?
我想要一个命令列出所有拥有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:
makecut
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)