Как я могу узнать, какие пользователи входят в группу в Linux?


68

Недавно я создавал новых пользователей и назначал их определенным группам. Мне было интересно, если есть команда, которая показывает всех пользователей, назначенных для определенной группы? Я пытался использовать команду «groups», однако всякий раз, когда я использую это, он говорит «groups: not found»


3
Это groupsкоманда. Вряд ли у вас его нет в Linux, поскольку он является частью coreutils.
— Томас Дики

@ThomasDickey Но это возможно - как на некоторых NAS.
— Томас В.

Ответы:


43

Вы можете использовать grep:

grep '^group_name_here:' /etc/group

В этом списке перечислены только дополнительные группы, а не пользователь, у которого эта группа является основной. И он находит только локальные группы, а не группы из сетевой службы, такой как LDAP.


6
Не работает с централизованной аутентификацией.
— Максим Егорушкин

1
Это может быть действительно запутанным, вероятно, из-за первичного / вторичного различия. Я думаю, что этого следует избегать в пользу. У sudo lid -g {group}меня есть система, в которой в этом ответе перечислены 8 пользователей в группе, а в sudo lid -g {group}списке
— DKroot

Смотрите getentответ @Murray Jensen ниже
— scrutari

84

Я предпочитаю использовать команду getent ...

Поскольку getent использует ту же службу имен, что и система, getent отображает всю информацию, включая информацию, полученную из сетевых источников информации, таких как LDAP.

Таким образом, для группы, вы должны использовать следующее ...

getent group name_of_group

где name_of_group заменяется группой, которую вы хотите найти. Обратите внимание, что это возвращает только дополнительные членства в группах, но не включает пользователей, у которых эта группа является основной.

Есть много других поисков, которые вы можете сделать ... passwdбудучи еще одним полезным, который вам нужно будет перечислить основные группы.


1
Другие ответы не применяются, если вы не являетесь администратором, а информация о группе хранится на другом сервере.
— Андрес Алькаррас

1
Это может быть действительно запутанным, вероятно, из-за первичного / вторичного различия. Я думаю, что этого следует избегать в пользу. У sudo lid -g {group}меня есть система, где этот ответ перечисляет 8 пользователей в группе, тогда как sudo lid -g {group}перечисляет 10.
— DKroot

12

Проще сделать groups [username]

Если вы хотите перечислить всех локальных пользователей и их локальные группы, вы можете сделать

cat /etc/passwd | awk -F':' '{ print $1}' | xargs -n1 groups

Если вы получаете «groups: command not found», скорее всего, вы изменили свой путь к среде для худшего, чтобы сбросить путь PATH=$(getconf PATH)


Он работает для определенной группы, если | grep {group}он добавлен, и дает правильный ответ в отличие от getent group name_of_groupилиgrep '^group_name_here:' /etc/group
— DKroot

1
Вместо этого cat /etc/passwdвы должны использовать gentent passwdтак, чтобы пользователи в nis / ldap по-прежнему оставались в списке. Единственным недостатком является то, что это может занять довольно много времени.
— Брайан Минтон

8
groupmems -g имя_группы -l

перечисляет всех пользователей в указанной группе.


Обратите внимание, что groupmemsэто часть утилит shadow, используемых в большинстве дистрибутивов Linux, однако groupmemsв настоящее время она отсутствует в Debian и его производных ( ошибка исправлена, но еще не включена ни в один выпуск (по состоянию на ноябрь 2016 г.))
— Стефан Шазелас

2
Также обратите внимание, что он работает groupmemsтолько с группами /etc/group(не входящими в LDAP или другую пользовательскую базу данных) и требует привилегий суперпользователя при попытке открыть / etc / gshadow.
— Стефан Шазелас

Несмотря на оговорки, упомянутые выше, эта команда идеальна для определенных ситуаций, поскольку она не требует дополнительного анализа выходных данных (т. Е. cutИ друзей).
— Бон

Это может быть действительно запутанным, вероятно, из-за первичного / вторичного различия. Я думаю, что этого следует избегать в пользу sudo lid -g {group}. У меня есть система, где этот ответ перечисляет 8 пользователей в группе, а sudo lid -g {group}списки 10.
— DKroot

6

Я удивлен, что никто не упомянул

id <user>

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


3
Потому что - вопреки названию - спрашивающий хотел знать пользователей в данной группе, а не группы данного пользователя, как подробно описано в вопросе. Теперь я перефразировал заголовок, чтобы он соответствовал содержанию.
— Дубу

Аааа, понятно Я должен был прочитать текст вопроса лучше. Благодарю.
— Алекс

4

groupsКоманда печатает членство в группах для пользователя. Вы можете использовать lidкоманду для вывода списка пользователей в группу, например:

# lid -g <groupname>

4
lidявляется частью libuser, который не устанавливается по умолчанию во многих дистрибутивах.
— Крис Даун

2

ОП сформулировал вопрос, чтобы исключить возможность использования команды groups . Так как это часть coreutils в Linux, либо (а) он был удален, либо (б) OP неправильно набирает имя.

OP мог бы использовать groupsтак, например:

for name in $(cut -d: -f1 /etc/passwd);do groups $name|grep -w sudo|awk '{print $1;}';done

Один предложенный ответ просто grep для названия группы в /etc/group. Иногда это работает как задумано.

Немного лучшее использование grep учитывает синтаксис /etc/group:

group_name:password:GID:user_list

так что только часть перед первым двоеточием является допустимым именем группы. Простой grep без учета синтаксиса может (и будет) забирать вводящие в заблуждение совпадения из файла. Используйте регулярные выражения, чтобы grep соответствовал именно тому, что нужно:

grep -E '^users:' /etc/group |sed -e 's/^.*://'

или используя переменную оболочки:

grep -E '^'$groupname':' /etc/group |sed -e 's/^.*://'

Однако, это только список тех, кто не входит в группу по умолчанию . Чтобы добавить их , необходимо принять во внимание файл паролей, например, путем извлечения номера идентификатора группы из /etc/groupи печати пользователей, чья группа по умолчанию соответствует /etc/passwd, например, из

grp=$(awk -F: '$1 ~ /^users$/ {print $3; }' </etc/group)
awk -F: '$4 ~ /^'$grp'$/ { print $1; }' </etc/passwd

Вы можете сделать то же самое, используя только grep и sed, но это больше, чем использование awk.

Другой предложенный ответ, предложенный с использованием getent, который также, вероятно, будет на Linux-машине (с Debian он является частью GNU libc). Однако быстрая проверка показывает, что он предоставляет только /etc/groupконтент.

У меня (как и у большинства) нет libusersили не lidустановлено, поэтому я не могу комментировать, удовлетворяет ли он условиям ОП.

Также есть idпрограмма, которая дает групповую информацию. Кто-то может расширить это как возможный ответ.


Или просто, sed -n "s/^$groupname:.*://p" /etc/groupно это все равно может сообщать о неправильных результатах, если имя группы содержит операторы RE ( .например, нередки имена групп).
— Стефан Шазелас

GNU getentтакже будет запрашивать LDAP / NIS ... хотя, возможно, нет, когда перечисление явно отключено для базы данных группы.
— Стефан Шазелас

Обратите внимание, что groupsэто не помогло бы, поскольку в нем перечислены группы, членом которых является данный пользователь, а не список членов данной группы.
— Стефан Шазелас

2

Работает как шарм:

cut -d: -f1,4 /etc/passwd | grep $(getent group <groupname> | cut -d: -f3) | cut -d: -f1

В отличие от принятого ответа @ARG, эта команда перечисляет пользователей, у которых <groupname> в качестве основной группы
— Bhavik

это должен быть принятый ответ
— Николай Ненов

1
Я не согласен. Поскольку он читает пользователей в / etc / passwd, он не будет работать с другими модулями nsswitch, которые обращаются к LDAP и т. Д.
— Иван Вучица,

У меня не получилось: я получил 4 участника в группе, тогда как sudo lid -gсписков 8. @Bhavik Принятый ответ также не верен.
— DKroot

2

Некоторые скажут вам установить libuser (для 'lid') или members (для 'members'). Но, основываясь на ответе https://unix.stackexchange.com/a/349648/77959, который решил эту проблему с членством в группе входа в систему, я обнаружил, что другая группа не покрывается этим сценарием. Итак - вот лучшее из обоих подходов в сочетании:

#!/bin/bash
if [ $# -eq 1 ]; then
        list_a=`cut -d: -f1,4 /etc/passwd | grep $(getent group "$1"| cut -d: -f3) | cut -d: -f1`
        list_b=`getent group "$1"|cut -d: -f4|sed 's/,/\n/g'`
        echo -e "$list_a\n$list_b"|grep -v "^$"|sort|uniq
else
        echo "pass me a group to find the members of"
fi

В моей системе это работало корректно, в отличие от ответов, включающих getentили grep'^group_name_here:' /etc/group
— DKroot

0

Эта модификация подхода user3717722 будет перечислять членов группы в базе данных NIS:

ypcat passwd | cut -d: -f1,4 | grep $(getent group <groupname> | cut -d: -f3) | cut -d: -f1
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.