Вопрос или проблема
Я недавно создавал новых пользователей и назначал их в определённые группы. Мне было интересно, есть ли команда, которая показывает всех пользователей, назначенных в определённую группу? Я пробовал использовать команду ‘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.