Я хочу, чтобы команда перечисляла всех пользователей, которые имеют привилегии root, т.е. sudo?
Предположим, я пользователь sudoer. Как я мог знать всех других пользователей sudoer?
Я хочу, чтобы команда перечисляла всех пользователей, которые имеют привилегии root, т.е. sudo?
Предположим, я пользователь sudoer. Как я мог знать всех других пользователей sudoer?
Ответы:
Если вам просто нужно перечислить sudoers, перечисленных в sudo
группе, я думаю, что лучший способ сделать это - запустить эту команду (которая должна быть вычислительно легче, чем любая из других команд в этом ответе):
grep -Po '^sudo.+:\K.*$' /etc/group
Также, как предлагается в комментариях Muru, формат записей в /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
сопоставляет регулярные выражения в стиле Perlo
: grep
печатает только совпадающую строку'^sudo.+:\K.*$'
: делает grep
соответствие регулярному выражению между кавычкамиRegex # 1 разбивка:
^
: начало строки.+
: один или несколько символов\K
: отменить предыдущий матч.*
: ноль или более символов$
: конец линииКоманда № 2 разбивка:
grep
: Печатает все строки, соответствующие регулярному выражению в файле'^sudo.+:\K.*$'
: делает grep
соответствие регулярному выражению между кавычкамиcut
: Печатает только указанный раздел каждой строки в файле-d:
: cut
интерпретировать :
как разделитель полей-f4
: cut
печатает только четвертое полеРаспределение Regex # 2:
^
: начало строки.*
: ноль или более символов$
: конец линииgetent group sudo | cut -d: -f4
или используйте awk, но в любом случае помните, что group и passwd имеют фиксированные форматы с разделителями.
getent group
- вам вообще не нужен grep. getent group foo
это как grep foo /etc/group
, но более способный.
getent
, хоть как-то размышляли о том, как grep
и getent
сравнивать в вычислительном отношении? Будет ли легче бежать getent
?
sudo
группы. У некоторых юниксов есть другие группы, такие как wheel
. Ответ @muru будет включать всех sudoers независимо от того, в каких группах они находятся.
Как указано здесь, я рассматриваю самый простой способ поиска с -l
& -U
параметрами вместе, просто напечатайте users
его, например: John
then:
Если у пользователя есть 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.
for u in $(awk -F'[/:]' '{if($3>=1000&&$3!=65534) print $1}' /etc/passwd); do sudo -lU "$u" ; done
. быстрый взлом ничего не гарантировал :)
"%domain admins@mycompany.intra" ALL=(ALL) ALL
это работает. Вы сэкономили мне много времени, потому что я не знал, что это работает и для не локальных пользователей.
Как уже было сказано, ответ можно найти на 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
)
Развернув 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
.
В большинстве 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: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
Как мы можем сказать, youruser является администратором системы и членом группы 4 (adm). Но youruser и mybrother являются членами группы 27, которая является номером gid (идентификация группы) группы sudo. Таким образом, mybrother также может получить права root (суперпользователь).
Многие системы Linux, такие как Fedora и Slackware, включают gid группы колес = 10. Что дает права администратора при применении команды sudo. В системах на основе BSD (например, FreeBSD) пользователь root является членом группы wheel, которая имеет значение 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
Команда:
cat /etc/group | grep sudo
Выход:
sudo:x:27:Tom,Stacy
Том, Стейси - пользователи с привилегиями sudo.
cat
.
Я был поставлен в тупик о том, как vagrant
пользователь может использовать, sudo
даже если он не упомянут /etc/sudoers
ни в, /etc/group
ни в с getent
.
Оказывается sudo
также читает записи из всех файлов в/etc/sudoers.d/
. Поэтому, если вы не просматривали этот каталог, вы можете не понимать, сколько пользователей на самом деле имеют sudo
доступ.
Такой sudo
доступ может быть обнаружен ответ Joker, используя , sudo -l -U vagrant
но не обнаруживается какой - либо из других ответов здесь , которые все связаны либо getent
или /etc/group
.