Как мне перечислить всех пользователей с правами root?

35

На linux box, как мне перечислить всех пользователей, имеющих права суперпользователя (и, что еще лучше, всех пользователей в целом вместе с тем, есть ли у них root или нет)?

Эрик
источник
1
Можете ли вы быть более точным относительно того, что вы подразумеваете под «привилегиями суперпользователя»? Вы имеете в виду пользователей с UID = 0?
Крис С
Пользователи, имеющие возможность делать что угодно. В основном - мне нужно перечислить пользователей вместе с группами, членами которых они являются, если это возможно.
Эрик
2
Если бы я знал, где находится ваш компьютер, я мог бы подойти и выдернуть шнур питания. Это квалифицируется как «делай что угодно», что означает, что я в твоем списке. Рафик перечислил три наиболее распространенные вещи, но их может быть больше, и мы знаем, что происходит с вашей системой или как она настроена.
Крис С

Ответы:

42

Не забудьте сменить пароль root. Если любой пользователь имеет UID 0, кроме root, он не должен. Плохая идея. Проверять:

grep 'x:0:' /etc/passwd

Опять же, вы не должны делать это, но чтобы проверить, является ли пользователь членом корневой группы:

grep root /etc/group

Чтобы узнать, может ли кто-либо выполнять команды от имени пользователя root, проверьте sudoers:

cat /etc/sudoers

Чтобы проверить бит SUID, который позволяет программам выполняться с правами root:

find / -perm -04000

сигнализатор
источник
Строго говоря, первый работает только в том случае, если файл теневого пароля находится у пользователя. Я согласен, что в наши дни это почти всегда так, но на всякий случай я выполнил быструю работу над Perl, которая явно проверяет поле 3.
MadHatter поддерживает Monica
4
Это лучший шаблон, чем первый grep '[^:]*:[^:]*:0:' /etc/passwd. +1 в частности для проверки на SUID.
Приостановлено до дальнейшего уведомления.
33

Чтобы увидеть, кто является UID 0:

getent passwd 0

Чтобы увидеть, кто в группах root, wheel admи admin:

getent group root wheel adm admin

Чтобы перечислить всех пользователей и группы, членами которых они являются:

getent passwd | cut -d : -f 1 | xargs groups
Приостановлено до дальнейшего уведомления.
источник
9
В отличие от всех других ответов, которые ошибочно полагаются на файл / etc / passwd, этот, используемый getent passwdвместо этого, на самом деле правильный. Только не забудьте проверить / etc / sudoers.
Mivk
Спасибо за это. Намного понятнее Для меня это принятый ответ.
Fiddy Bux
6

Чистый корень - это идентификатор пользователя "0".

Все пользователи в системе находятся в файле / etc / passwd:

less /etc/passwd

Те, кто является root, имеют "0" в качестве идентификатора пользователя, который является 3-м столбцом. Те, у кого "0" в качестве группы (4-й столбец) также могут иметь некоторые привилегии root.

Далее вы захотите взглянуть на группы и посмотреть, кто является дополнительным членом групп «root», «wheel» или «admin»:

less /etc/group

Пользователи, перечисленные в этих группах, могут иметь некоторые привилегии root, особенно с помощью команды "sudo".

Последняя вещь, которую вы захотите проверить, - это конфигурация "sudo" и посмотреть, кто указан как имеющий полномочия на выполнение этой команды. Этот файл хорошо документирован, поэтому я не буду воспроизводить его здесь:

less /etc/sudoers

Это охватывает основные области, которые могут иметь root-доступ.

Рафик Маниар
источник
См. Также serverfault.com/questions/205598/…, чтобы узнать о нескольких других местах, где могут быть предоставлены права на повышение привилегий. (А именно, consolehelperи PackageKit.)
mattdm
2
Всем пользователям определенно НЕ гарантировано быть в / etc / passwd. Они могут быть в LDAP, например. Но getent passwdследует перечислить всех пользователей системы (включая root) в формате passwd, независимо от базы данных, в которой они определены.
Mivk
3

Для печати всех пользователей

perl -n -e '@user = split /:/ ; print "@user[0]\n";' < /etc/passwd

Чтобы напечатать только тех пользователей с UID 0, которые, как говорили другие, пользователи с неявными привилегиями root:

perl -n -e '@user = split /:/ ; print "@user[0]\n" if @user[2] == "0";' < /etc/passwd
MadHatter поддерживает Монику
источник
Это хороший вариант, но помните об ограничениях (я уверен, что MadHatter уже знает об этом) - он не будет проверять группы и не будет проверять sudoers. Он будет только проверять, как он говорит, неявный root.
Рафик Маниар
2
Не разбирайте / etc / passwd. Пользователи могут быть определены в другом месте. Используйте getent passwdвместо этого. Для вашего первого примера «напечатать всех пользователей» попробуйте следующее:getent passwd | perl -naF: -e 'print "$F[0]\n"'
mivk
2

Чтобы получить быстрый список всех пользователей, попробуйте дважды нажать вкладку (для автозаполнения) после ввода passwdкоманды с пробелом. Это работает и с suкомандой.

Должно быть сделано как привилегированный пользователь.

Emeraldo
источник
Это особенность Zsh? Bash предлагает только файлы на openSUSE.
jgillich
Проверено на Debian (Squeeze) в bash. Я не верю, что кто-то официально поддержит это, но это ярлык.
Эмеральдо
Обновление: это больше не работает в El Capitan. Вероятно, это было исправлено из соображений безопасности.
Эмеральдо
0

Меня раздражало, что не было однострочного ответа ... Если вы хотите перечислить все учетные записи UID 0 (root), используйте следующее:

cat /etc/passwd | cut -f1,3,4 -d":" | grep"0:0" | cut -f1 -d":" | awk '{print $1}'

Лучший,

Boschko
источник