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

68

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

Джесс Луиза
источник
3
Это groupsкоманда. Вряд ли у вас его нет в Linux, поскольку он является частью coreutils.
Томас Дики
@ThomasDickey Но это возможно - как на некоторых NAS.
Томас В.

Ответы:

43

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

grep '^group_name_here:' /etc/group

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

ARG
источник
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)

ZN13
источник
Он работает для определенной группы, если | 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

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

user198963
источник
Обратите внимание, что 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>

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

Alex
источник
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
Bhavik
источник
В отличие от принятого ответа @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
flowtron
источник
В моей системе это работало корректно, в отличие от ответов, включающих 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
Хольгер Фёрстерлинг
источник