Как я могу перечислить всех суперпользователей?

Я хочу, чтобы команда перечислила всех пользователей, имеющих права суперпользователя, т.е. sudo?

Предположим, я пользователь sudoer. Как я могу знать всех других пользователей sudoer?

Если вам просто нужно перечислить sudoers, перечисленные в sudo группы, я думаю, что лучшим способом сделать это было бы запустить эту команду (которая должен быть вычислительно легче, чем любая из других команд в этом ответе):

grep -Po '^sudo.+:\K.*$' /etc/group

Также, как было предложено в комментариях муру, формат записей в /etc/group может быть легко обработан с помощью cut:

grep '^sudo:.*$' /etc/group | cut -d: -f4

Кроме того, опять же, как было предложено в комментариях муру, можно использовать 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:

  • Любой символ или группа символов, не перечисленных в списке, соответствует самому символу или группе символов
  • ^: начало строки
  • .*: ноль или более символов
  • $: конец строки

Как в нем говорилось здесь Я считаю, что самый простой способ открыть для себя с -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 на локальном хостинге:

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

Расширяя информацию о 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 не возвращает ненулевое значение выхода, которым мы могли бы воспользоваться, поэтому мы сводимся к grepping выходных данных.

Как уже было сказано, ответ можно найти на Обмен стеками Unix и Linux:

Это показывает, что пользователь "saml" является членом группы wheel.

$ getent group wheelwheel:x:10:saml

Единственное отличие заключается в том, что группа в Ubuntu не wheel, но sudo (или admin в более старых версиях Ubuntu). Таким образом, команда становится:

getent group sudo

Команда:

cat /etc/group | grep sudo

Выход:

sudo:x:27:Tom,Stacy

Том, Стейси - это пользователи с привилегиями sudo.

В большинстве Unix-подобных систем, которые имеют команду sudo и имеют файл конфигурации sudo; запуск visudo от имени root:

:~$ sudo bash

или

:~$ su:~# visudo

позволит администратору проверять и изменять привилегии групп, которые могут использовать команду sudo.

В Unix-подобных системах на базе Debian, таких как Ubuntu, группы 4 и 27 обычно имеют права доступа к привилегиям sudo.

Группа 4 - это группа администраторов (adm), а группа 27 - это идентификатор sudo gid.

Чтобы узнать, какие пользователи в настоящее время назначены этим группам, откройте файл /etc/group, как показано ниже:

:~$ cat /etc/group

Пример вывода на Ubuntu (но не на базе Redhat, Oracle Solaris / Solaris или систем на базе BSD) даст следующее:

adm:x:4:yourusertty: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,mybrotherfloppy:x:25:tape:x:26:sudo:x:27:youruser,mybrother

Как мы можем судить, ваш пользователь является администратором системы и членом группы 4 (adm). Но youruser и mybrother оба являются членами группы 27, которая является идентификатором gid (групповой идентификационный номер) группы sudo. Таким образом, мой брат также может получить права суперпользователя (суперпользователя).

Многие системы Linux, такие как Fedora и Slackware, включают в себя группу колес gid=10. Который предоставляет права администратора при применении команды sudo. В системах, основанных на BSD (например, FreeBSD), пользователь root является членом группы wheel, которая имеет 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)

Эта команда возвращает список пользователей с правами 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

Я был озадачен тем, как vagrant пользователь может использовать sudo даже не будучи упомянутым в /etc/sudoers ни в /etc/group ни найдено с getent.

Оказывается sudo также считывает записи из всех файлов в разделе /etc/sudoers.d/. Так что, если вы не просматривали этот каталог, вы можете не осознавать, сколько пользователей на самом деле есть sudo доступ.

Такого рода sudo доступ может быть обнаружен по ответу Джокера с помощью sudo -l -U vagrant но не обнаруживается ни одним из других ответов здесь, которые все полагаются на либо getent или /etc/group.

Основано на ответах от @muru и @kos, но с некоторой оптимизацией.

То getent group sudo команда перечисляет только пользователей, у которых есть группа sudo. Остальные команды проверяют, действительно ли пользователь может работать от имени root. Существуют также другие дополнения для улучшения форматирования выходных данных.

команда

if [ -z $(getent group sudo) ]; then printf "\n >>>>>>>>>>> NO ENTRIES <<<<<<<<<<<\n\n"; else getent group sudo | sed 's/.*://' | sed 's/,/\n/g' | xargs -L1 sudo -l -U | grep -v 'not allowed' | sed 's/Matching Defaults entries/\n >>>>>>>>>>> CAN RUN COMMANDS AS ROOT >>>>>>>>>>>\n\nMatching Defaults entries/g' | sed '$a\\'; fi

выход

 >>>>>>>>>>> CAN RUN COMMANDS AS ROOT >>>>>>>>>>>Matching Defaults entries for may_user_i on localhost:    !visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/binUser may_user_i may run the following commands on localhost:    (ALL) ALL    (ALL) ALL >>>>>>>>>>> CAN RUN COMMANDS AS ROOT >>>>>>>>>>>Matching Defaults entries for may_user_ii on localhost:    !visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/binUser may_user_ii may run the following commands on localhost:    (ALL) ALL

Спасибо! =D

[Ссылки.: https://askubuntu.com/a/611607/134723 , https://askubuntu.com/a/611646/134723 , https://unix.stackexchange.com/a/136798/61742 , https://unix.stackexchange.com/a/26639/61742 ]

Я нахожу это милым permissions - How do I find out if I am sudoer? - Unix & Linux Stack Exchange

Обратите внимание, что только Джокер и муру ответы правильные, только синтаксический анализ файлов user /group conf не дает вам, у кого есть разрешение sudo, а у кого нет … если пользователь находится в группе sudo, но `значит, в файле sudoers ничего не упоминается о группе “sudo”?

Вот ответ: permissions - View list of sudoers with no sudo privileges - Unix & Linux Stack Exchange

@Джокер милый и хитрый