Как мне перечислить всех членов группы в Linux (и, возможно, в других организациях)?
Как перечислить всех пользователей в группе Linux?
Ответ 1
К сожалению, нет хорошего, переносного способа сделать это, о котором я знаю. Если вы попытаетесь разобрать /etc/group, как указывают другие, вы пропустите пользователей, у которых есть группа в качестве основной группы, и всех, кто был добавлен в эту группу с помощью механизма, отличного от плоских файлов UNIX (то есть LDAP, NIS, pam-pgsql и т.д.).
Если бы я сам должен был сделать это сам, я бы сделал это наоборот: используйте id
, чтобы получить группы каждого пользователя в системе (которые будут тянуть все источники, видимые для NSS), и использовать Perl или что-то похожее на сохранение хеш-таблицы для каждой группы, которая обнаружила членство этого пользователя.
Изменить: Конечно, это оставляет вам аналогичную проблему: как получить список каждого пользователя в системе. Поскольку в моем местоположении используются только плоские файлы и LDAP, я могу просто получить список из обоих мест, но это может быть или не быть истинным для вашей среды.
Отредактируйте 2: кто-то мимоходом напомнил мне, что getent passwd
вернет список всех пользователей в системе, включая имена из LDAP/NIS/etc., но getent group
по-прежнему будут пропускать пользователей, которые являются членами только через по умолчанию, так что это вдохновило меня написать этот быстрый хак.
#!/usr/bin/perl -T
#
# Lists members of all groups, or optionally just the group
# specified on the command line
#
# Copyright © 2010-2013 by Zed Pobre ([email protected] or [email protected])
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
use strict; use warnings;
$ENV{"PATH"} = "/usr/bin:/bin";
my $wantedgroup = shift;
my %groupmembers;
my $usertext = `getent passwd`;
my @users = $usertext =~ /^([a-zA-Z0-9_-]+):/gm;
foreach my $userid (@users)
{
my $usergrouptext = `id -Gn $userid`;
my @grouplist = split(' ',$usergrouptext);
foreach my $group (@grouplist)
{
$groupmembers{$group}->{$userid} = 1;
}
}
if($wantedgroup)
{
print_group_members($wantedgroup);
}
else
{
foreach my $group (sort keys %groupmembers)
{
print "Group ",$group," has the following members:\n";
print_group_members($group);
print "\n";
}
}
sub print_group_members
{
my ($group) = @_;
return unless $group;
foreach my $member (sort keys %{$groupmembers{$group}})
{
print $member,"\n";
}
}
Ответ 2
getent group <groupname>;
Он переносится как в Linux, так и в Solaris, и работает с файлами локальных групп/паролей, NIS и LDAP.
Ответ 3
Использовать Python для отображения групп:
python -c "import grp; print grp.getgrnam('GROUP_NAME') [3]"
Ответ 4
lid -g groupname | cut -f1 -d'('
Ответ 5
Следующая команда перечисляет всех пользователей, относящихся к <your_group_name>
, но только те, которые управляются базой данных /etc/group
, а не LDAP, NIS и т.д. Он также работает только для вторичных групп, он выиграл 't укажите пользователей, у которых эта группа установлена как первичная, поскольку первичная группа хранится как GID
(числовой идентификатор группы) в файле /etc/passwd
.
grep <your_group_name> /etc/group
Ответ 6
Следующая команда перечисляет всех пользователей, относящихся к <your_group_name>
, но только те, которые управляются базой данных /etc/group
, а не LDAP, NIS и т.д. Он также работает только для вторичных групп, он выиграл 't укажите пользователей, у которых эта группа установлена как первичная, поскольку первичная группа хранится как GID
(числовой идентификатор группы) в файле /etc/passwd
.
awk -F: '/^groupname/ {print $4;}' /etc/group
Ответ 7
Следующий скрипт оболочки будет перебирать всех пользователей и печатать только те имена пользователей, которые принадлежат данной группе:
#!/usr/bin/env bash
getent passwd | while IFS=: read name trash
do
groups $name 2>/dev/null | cut -f2 -d: | grep -i -q -w "$1" && echo $name
done
true
Пример использования:
./script 'DOMAIN+Group Name'
Примечание. Это решение будет проверять NIS и LDAP на наличие пользователей и групп (не только файлов passwd
и group
). Также будут учитываться пользователи, не добавленные в группу, но имеющие группу, установленную в качестве основной группы.
Редактировать: Добавлено исправление для редкого сценария, когда пользователь не принадлежит к группе с тем же именем.
Редактировать: написано в виде сценария оболочки; добавлено true
для выхода со статусом 0
как предложено @Max Chernyak aka hakunin; отброшенный stderr
, чтобы пропустить эти случайные groups: cannot find name for group ID xxxxxx
.
Ответ 8
Вы можете сделать это в одной командной строке:
cut -d: -f1,4 /etc/passwd | grep $(getent group <groupname> | cut -d: -f3) | cut -d: -f1
В приведенной выше команде перечислены все пользователи, имеющие groupname в качестве своей основной группы
Если вы также хотите указать пользователей, у которых groupname, как их вторичная группа, используйте следующую команду
getent group <groupname> | cut -d: -f4 | tr ',' '\n'
Ответ 9
Zed-реализация должна, вероятно, быть расширена для работы с некоторыми другими крупными UNIX.
Кто-то имеет доступ к оборудованию Solaris или HP-UX?; не проверяли эти случаи.
#!/usr/bin/perl
#
# Lists members of all groups, or optionally just the group
# specified on the command line
#
# Date: 12/30/2013
# Author: William H. McCloskey, Jr.
# Changes: Added logic to detect host type & tailor subset of getent (OSX)
# Attribution:
# The logic for this script was directly lifted from Zed Pobre work.
# See below for Copyright notice.
# The idea to use dscl to emulate a subset of the now defunct getent on OSX
# came from
# http://zzamboni.org/\
# brt/2008/01/21/how-to-emulate-unix-getent-with-macosxs-dscl/
# with an example implementation lifted from
# https://github.com/petere/getent-osx/blob/master/getent
#
# Copyright © 2010-2013 by Zed Pobre ([email protected] or [email protected])
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
use strict; use warnings;
$ENV{"PATH"} = "/usr/bin:/bin";
# Only run on supported $os:
my $os;
($os)=(`uname -a` =~ /^([\w-]+)/);
unless ($os =~ /(HU-UX|SunOS|Linux|Darwin)/)
{die "\$getent or equiv. does not exist: Cannot run on $os\n";}
my $wantedgroup = shift;
my %groupmembers;
my @users;
# Acquire the list of @users based on what is available on this OS:
if ($os =~ /(SunOS|Linux|HP-UX)/) {
#HP-UX & Solaris assumed to be like Linux; they have not been tested.
my $usertext = `getent passwd`;
@users = $usertext =~ /^([a-zA-Z0-9_-]+):/gm;
};
if ($os =~ /Darwin/) {
@users = `dscl . -ls /Users`;
chop @users;
}
# Now just do what Zed did - thanks Zed.
foreach my $userid (@users)
{
my $usergrouptext = `id -Gn $userid`;
my @grouplist = split(' ',$usergrouptext);
foreach my $group (@grouplist)
{
$groupmembers{$group}->{$userid} = 1;
}
}
if($wantedgroup)
{
print_group_members($wantedgroup);
}
else
{
foreach my $group (sort keys %groupmembers)
{
print "Group ",$group," has the following members:\n";
print_group_members($group);
print "\n";
}
}
sub print_group_members
{
my ($group) = @_;
return unless $group;
foreach my $member (sort keys %{$groupmembers{$group}})
{
print $member,"\n";
}
}
Если есть лучший способ поделиться этим предложением, пожалуйста, дайте мне знать; Я рассмотрел множество способов, и это то, что я придумал.
Ответ 10
Я сделал это похоже на код perl выше, но заменил getent и id на собственные функции perl. Это намного быстрее и должно работать в разных вариантах * nix.
#!/usr/bin/env perl
use strict;
my $arg=shift;
my %groupMembers; # defining outside of function so that hash is only built once for multiple function calls
sub expandGroupMembers{
my $groupQuery=shift;
unless (%groupMembers){
while (my($name,$pass,$uid,$gid,$quota,$comment,$gcos,$dir,$shell,$expire)=getpwent()) {
my $primaryGroup=getgrgid($gid);
$groupMembers{$primaryGroup}->{$name}=1;
}
while (my($gname,$gpasswd,$gid,$members)=getgrent()) {
foreach my $member (split / /, $members){
$groupMembers{$gname}->{$member}=1;
}
}
}
my $membersConcat=join(",",sort keys %{$groupMembers{$groupQuery}});
return "$membersConcat" || "$groupQuery Does have any members";
}
print &expandGroupMembers($arg)."\n";
Ответ 11
немного grep и tr:
$ grep ^$GROUP /etc/group | grep -o '[^:]*$' | tr ',' '\n'
user1
user2
user3
Ответ 12
Существует удобный пакет Debian и Ubuntu с именем members ", который обеспечивает эту функциональность:
Описание: Показывает членов группы; по умолчанию все участники члены являются дополнением к группам: тогда как группы показывают группы, к которым принадлежит определенный пользователь, участники показывают пользователей принадлежащих к определенной группе.
... Вы можете попросить первичных участников, второстепенных участников, как на одна строка, каждая на отдельных строках.
Ответ 13
getent group insert_group_name_here | awk -F ':' '{print $4}' | sed 's|,| |g'
Это возвращает список разделенных пробелами пользователей, которые я использовал в сценариях для заполнения массивов.
for i in $(getent group ftp | awk -F ':' '{print $4}' | sed 's|,| |g')
do
userarray+=("$i")
done
или
userarray+=("$(getent group GROUPNAME | awk -F ':' '{print $4}' | sed 's|,| |g')")
Ответ 14
Вот script, который возвращает список пользователей из /etc/passwd и/etc/group он не проверяет NIS или LDAP, но показывает пользователей, у которых группа в качестве группы по умолчанию Протестировано на Debian 4.7 и solaris 9
#!/bin/bash
MYGROUP="user"
# get the group ID
MYGID=`grep $MYGROUP /etc/group | cut -d ":" -f3`
if [[ $MYGID != "" ]]
then
# get a newline-separated list of users from /etc/group
MYUSERS=`grep $MYGROUP /etc/group | cut -d ":" -f4| tr "," "\n"`
# add a newline
MYUSERS=$MYUSERS$'\n'
# add the users whose default group is MYGROUP from /etc/passwod
MYUSERS=$MYUSERS`cat /etc/passwd |grep $MYGID | cut -d ":" -f1`
#print the result as a newline-separated list with no duplicates (ready to pass into a bash FOR loop)
printf '%s\n' $MYUSERS | sort | uniq
fi
или как однострочный вы можете вырезать и вставлять прямо отсюда (изменить имя группы в первой переменной)
MYGROUP="user";MYGID=`grep $MYGROUP /etc/group | cut -d ":" -f3`;printf '%s\n' `grep $MYGROUP /etc/group | cut -d ":" -f4| tr "," "\n"`$'\n'`cat /etc/passwd |grep $MYGID | cut -d ":" -f1` | sort | uniq
Ответ 15
В UNIX (в отличие от GNU/Linux) есть команда listusers. См. справочная страница Solaris для пользователей-пользователей.
Обратите внимание, что эта команда является частью проекта проекта Heirloom. Я предполагаю, что он отсутствует в GNU/Linux, потому что RMS не верит в группы и разрешения.: -)
Ответ 16
Здесь очень простой awk script, который учитывает все распространенные ошибки, перечисленные в других ответах:
getent passwd | awk -F: -v group_name="wheel" '
BEGIN {
"getent group " group_name | getline groupline;
if (!groupline) exit 1;
split(groupline, groupdef, ":");
guid = groupdef[3];
split(groupdef[4], users, ",");
for (k in users) print users[k]
}
$4 == guid {print $1}'
Я использую это с моей настройкой с поддержкой ldap, работает на любом уровне, совместимом со стандартами getent и awk, включая solaris 8+ и hpux.
Ответ 17
getent group groupname | awk -F: '{print $4}' | tr , '\n'
Это имеет 3 части:
1 - getent group groupname
показывает строку группы в файле "/etc/group". Альтернатива cat /etc/group | grep groupname
.
2 - awk
печатать только элементы в одной строке, разделенные символом ','.
3 - tr
замените ',' на новую строку и напечатайте каждого пользователя в строке.
4 - Необязательно: вы также можете использовать другой канал с sort
, если пользователей слишком много.
Привет
Ответ 18
Я думаю, что самым простым способом являются следующие шаги, вам не нужно устанавливать какой-либо пакет или программное обеспечение:
-
Во-первых, вы узнаете GID группы, которую вы хотите знать пользователям, для этого есть много способов: cat/etc/group (последний столбец - GID) id user (пользователь - это тот, кто принадлежит группа)
-
Теперь вы перечислите всех пользователей в файле /etc/passwd, но вы примените некоторые фильтры со следующим продолжением команд, чтобы получить только членов предыдущей группы.
cut -d: -f1, 4/etc/passwd | grep GID (GID - это число, которое вы получили на шаге 1)
Команда cut выберет только некоторые "столбцы" файла, параметр d устанавливает разделитель ":", в этом случае параметр -f выбирает "поля" (или столбцы), которые будут показаны 1 и 4 в случае выхода ( в файле /etc/passwd столбец 1º - это имя пользователя, а 4º - это GID группы, к которой принадлежит пользователь), для завершения | grep GID отфильтрует только группу (в столбце 4º), которая ты выбрал.
Ответ 19
Я пробовал grep 'sample-group-name' /etc/group
, который отобразит список всех членов указанной вами группы на примере здесь