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

Вопрос или проблема

Я недавно создавал новых пользователей и назначал их в определённые группы. Мне было интересно, есть ли команда, которая показывает всех пользователей, назначенных в определённую группу? Я пробовал использовать команду ‘groups’, однако каждый раз, когда я использую её, пишется ‘groups: не найдено’

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

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

Итак, для группы вам следует использовать следующее …

getent group имя_группы

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

Существует много других запросов, которые вы можете выполнить … passwd – ещё одна полезная команда, которая вам потребуется для перечисления основных групп.

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

grep '^имя_группы_здесь:' /etc/group

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

Проще сделать groups [имя_пользователя]

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

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

Если вы получите “groups: команда не найдена”, вероятно, вы испортили свой путь окружения. Чтобы сбросить свой путь, сделайте PATH=$(getconf PATH)

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

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

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

# lid -g <имя_группы>

Обновление: В дистрибутивах на основе Debian имя команды отличается как libuser-lid. Обе команды предоставляются пакетом libuser, как упомянул @chris-down.

$ sudo libuser-lid -g lpadmin
kadir(uid=xxxx)

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

#!/bin/bash
if [ $# -eq 1 ]; then
        gid=`getent group "$1"|cut -d: -f3`
        list_a=`cut -d: -f1,4 /etc/passwd | grep ":$gid$" | 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 "предоставьте мне группу, чтобы найти членов"
fi

Работает как часы:

cut -d: -f1,4 /etc/passwd | grep $(getent group <имя_группы> | cut -d: -f3) | cut -d: -f1

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

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

id <пользователь>

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

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

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

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

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

function members {

echo "$(getent group $1 | cut -d: -f1,2,3):$(getent passwd | cut -d: -f1,4 | grep $(getent group $1 | cut -d: -f3) | cut -d: -f1 | paste -sd ','):$(getent group $1 | cut -d: -f4)"

}

Перечисляет основные и вторичные членства, разделенные двоеточием “:”

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

ypcat passwd | cut -d: -f1,4 | grep $(getent group <имя_группы> | cut -d: -f3) | cut -d: -f1

Ответ или решение

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

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

1. Использование getent

Одним из самых универсальных и мощных инструментов для получения информации о группах и пользователях является команда getent. Эта команда может извлекать информацию из различных источников, включая локальные файлы и сетевые источники, такие как LDAP.

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

getent group название_группы

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

2. Использование grep

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

grep '^название_группы:' /etc/group

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

3. Команда lid

Для систем, использующих пакет libuser, вы также можете использовать команду lid, которая предоставляет список всех пользователей в указанной группе:

lid -g название_группы

Для Debian-подобных дистрибутивов следует использовать:

libuser-lid -g название_группы

4. Определение всех пользователей и их групп

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

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

Это выведет список всех пользователей в системе и соответствующие им группы.

5. Пользовательская функция для получения членов группы

Если вам нужно более точное решение, вы можете создать пользовательскую функцию на Bash, чтобы получить всех членов группы, включая основных и дополнительных:

function members {
    echo "$(getent group $1 | cut -d: -f1,2,3):$(getent passwd | cut -d: -f1,4 | grep $(getent group $1 | cut -d: -f3) | cut -d: -f1 | paste -sd ','):$(getent group $1 | cut -d: -f4)"
}

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

Заключение

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

Если вы столкнулись с проблемами, такими как "команда не найдена", возможно, это связано с неправильной настройкой переменных окружения. Попробуйте сбросить путь командой:

PATH=$(getconf PATH)

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

Оцените материал
Добавить комментарий

Капча загружается...