@ Silmari89, Нет, если он хочет сделать это программно.
Пол Томблин
2
Я новичок здесь, я узнал, что SF существует сразу после того, как я отправил вопрос. Я согласен, что он принадлежит либо SF, либо SO.
user323094
5
Хех, конечно, теперь у него есть программное решение, так что и здесь это может быть оправдано.
Зед
Ответы:
103
К сожалению, я не знаю хорошего, портативного способа сделать это. Если вы попытаетесь проанализировать / etc / group, как предлагают другие, вы пропустите пользователей, у которых эта группа является основной, и всех, кто был добавлен в эту группу с помощью механизма, отличного от плоских файлов UNIX (например, LDAP, NIS, pam-pgsql и т. д.).
Если бы мне абсолютно необходимо было сделать это самому, я бы, вероятно, сделал это наоборот: используйте idдля получения групп каждого пользователя в системе (который будет извлекать все источники, видимые для NSS) и используйте Perl или что-то подобное для поддержания хэша таблица для каждой обнаруженной группы, отмечающая членство этого пользователя.
Изменить: Конечно, это оставляет вас с похожей проблемой: как получить список каждого пользователя в системе. Поскольку мое местоположение использует только плоские файлы и LDAP, я могу просто получить список из обоих местоположений, но это может или не может быть правдой для вашей среды.
Изменить 2: Кто-то мимоходом напомнил мне, что getent passwdвернет список всех пользователей в системе, включая пользователей из LDAP / NIS / и т. Д., Ноgetent group все равно будет по-прежнему скучать по пользователям, которые являются членами только через запись группы по умолчанию, так что это вдохновило меня на напиши этот быстрый взлом.
Спасибо всем, кто ответил. Я искал портативный способ сделать это. Ваша информация о том, что нет простого и переносимого способа, была полезна Вы также подробно рассказали об обстоятельствах, которые помогли мне глубже понять проблему, я ценю это и выбрал ваш ответ в качестве принятого.
user323094
2
Вы могли бы пожертвовать свой сценарий в фонд Linux? Это 2012 год, и до сих пор нет простого способа получить членов группы. Это то, что разочаровывает меня в Linux.
winteck
6
Я добавил ISC-подобную лицензию для вас, которая должна быть совместима практически с любой группой. Не стесняйтесь подавать его везде, где, по вашему мнению, оно будет принято.
Зед
PAM не предоставляет информацию об учетной записи. Это делает переключатель службы имен (nsswitch). Не все «базы данных» (поставщики данных) будут поддерживать перечисление, поэтому getent passwdмогут не работать (если, например, вы используете sssd).
Действительный пункт о PAM против NSS - я изменил ссылку. Хотя я не использовал его, на первый взгляд sssd выглядит как замена nscd, а не как должный поставщик данных, и если он сломается, getent passwdя бы посчитал это ошибкой в sssd.
Зед
239
getent group <groupname>;
Он переносим как в Linux, так и в Solaris и работает с локальными файлами групп / паролей, конфигурациями NIS и LDAP.
Это был бы самый хороший способ, за исключением того, что lid отсутствует в стандартной установке Debian. В Ubuntu он находится в необязательном пакете libuser (он не в id-utils с тем же именем). Я не нашел его в Debian :(
user323094
Работал для меня на Scientific Linux
blong
на Debian Wheezy, крышка тоже на пакете libuser
Lluís
2
@JohnMcGehee RHEL должен был называться AustereLinux
goelakash
1
«-g» не вариант для меня. У меня установлена версия id-utils 4.6 в Ubuntu 16.04.
Уилсон Биггс
25
Следующая команда выведет список всех пользователей, принадлежащих <your_group_name>, но только тех, кто управляется /etc/groupбазой данных, но не LDAP, NIS и т. Д. Она также работает только для вторичных групп , она не будет перечислять пользователей, для которых эта группа установлена в качестве основной, поскольку основная группа хранится как GID(числовой идентификатор группы) в файле /etc/passwd.
Вы можете использовать grep непосредственно в этот файл, например, grep <username> / etc / group. Быстрее и меньше накладных расходов.
Paintbox
16
Следующая команда выведет список всех пользователей, принадлежащих <your_group_name>, но только тех, кто управляется /etc/groupбазой данных, но не LDAP, NIS и т. Д. Она также работает только для вторичных групп , она не будет перечислять пользователей, для которых эта группа установлена в качестве основной, поскольку основная группа хранится как GID(числовой идентификатор группы) в файле /etc/passwd.
Не показывает пользователей, которые имеют группу в качестве группы по умолчанию.
rlpowell
3
Не проверяет NIS и LDAP.
Павел Надольский
12
Следующий скрипт оболочки будет перебирать всех пользователей и печатать только те имена пользователей, которые принадлежат данной группе:
#!/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.
Это здорово и очень кратко, но в нем напечатаны имя группы и имена пользователей
Эндрю Лориен
@andrewlorien, надеюсь, я исправил упомянутую вами проблему, если нет, пожалуйста, предоставьте более подробную информацию.
Павел Надольский
Этот фрагмент хорош, но он возвращает код выхода 1, есть ли причина, по которой он не возвращает 0? Легко ли это исправить?
Макс Черняк
@hakunin, он не возвращает 0, когда последнее имя пользователя не принадлежит группе. Вы можете добавить «|| true» в конце оператора, чтобы всегда получать 0, если это то, что вы хотите. Вы можете проверить вывод, чтобы увидеть, был ли найден какой-либо пользователь.
Павел Надольский
@ PawełNadolski Я понял, так что в итоге добавил ; true. Возвращать 0 - это хорошо, чтобы избежать отключения вашей системы управления конфигурацией (Chef, Ansible и т. Д.).
Предостережение: grepбудет соответствовать пользователю, чье имя содержит номер группы (например, sc0ttбудет отображаться как часть rootгруппы). Если это проблема, используйте регулярное выражение :$(getent group <groupname> | cut -d: -f3)\$(соответствует точке с запятой, идентификатору группы и концу строки). (Не добавляйте цитаты к регулярному выражению, или Баш жалуется.)
Скотт Стивенс
@ Скоттс Законное падение. Рекомендовал бы предложенные шаги
Подтвердили работу на Solaris 10 после перехода id -Gnна/usr/xpg4/bin/id -G -n
user667489
3
Я сделал это аналогично приведенному выше коду 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";
Ответ со ссылкой только не считается хорошим ответом при переполнении стека. Пожалуйста, рассмотрите возможность удаления этого, поскольку это не дает ответа на вопрос или более подробно о том, как этот ответ лучше принятого ответа. Или вы можете добавить это как комментарий, как только у вас будет достаточно репутации. Вы всегда можете комментировать свои собственные сообщения.
Дипен Шах
2
Существует удобный пакет Debian и Ubuntu, называемый ' members ', который обеспечивает эту функциональность:
Описание: показывает участников группы; по умолчанию все члены-члены являются дополнением к группам: в то время как группы показывают группы, к которым принадлежит указанный пользователь, участники показывают пользователей, принадлежащих к указанной группе.
... Вы можете запросить первичных, вторичных участников, как на одной строке, так и на каждой отдельной строке.
Вот скрипт, который возвращает список пользователей из / 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
или как однострочник вы можете вырезать и вставлять прямо отсюда (измените имя группы в первой переменной)
Обратите внимание, что эта команда является частью проекта Heirloom с открытым исходным кодом . Я предполагаю, что это отсутствует в GNU / Linux, потому что RMS не верит в группы и разрешения. :-)
Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится. - Из обзора
Knuhol
NAME listusers - print a list of user logins SYNOPSIS listusers [-g groups] [-l logins] DESCRIPTION Listusers prints the name and the gecos information of all users known to the system, sorted by username. Valid options are: -g groups Only print the names of users that belong to the given group. Multiple groups are accepted if separated by commas. -l logins Print only user names that match logins. Multiple user names are accepted if separated by commas.
Алан Карр
С веб-сайта проекта Heirloom: Проект Heirloom предоставляет традиционные реализации стандартных утилит Unix. Во многих случаях они были получены из оригинального материала Unix, выпущенного Caldera и Sun как Open Source. Интерфейсы следуют традиционной практике; в целом они остаются совместимыми с System V, хотя иногда предоставляются расширения, которые стали широко использоваться. Большинство утилит также включены в вариант, нацеленный на соответствие POSIX.
Алан Карр
0
Вот очень простой сценарий awk, который учитывает все распространенные ошибки, перечисленные в других ответах:
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.
Я думаю, что самым простым способом являются следующие шаги, вам не нужно устанавливать какой-либо пакет или программное обеспечение:
Во-первых, вы узнаете 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º), которую вы выбрал.
Вот еще один однострочник Python, который учитывает членство пользователя в группе по умолчанию (из /etc/passwd), а также из базы данных группы ( /etc/group)
python -c "import grp,pwd; print set(grp.getgrnam('mysupercoolgroup')[3]).union([u[0] for u in pwd.getpwall() if u.pw_gid == grp.getgrnam('mysupercoolgroup')[2]])"
Грэппинг уже /etc/groupесть как минимум в 3 других ответах, какую ценность ваш ответ добавляет к ним? Кроме того, все остальные ответы содержат комментарии о том, что такое решение работает только для вторичных групп, а также не для учетной записи, управляемой LDAP, NIS и т. Д.
Ответы:
К сожалению, я не знаю хорошего, портативного способа сделать это. Если вы попытаетесь проанализировать / etc / group, как предлагают другие, вы пропустите пользователей, у которых эта группа является основной, и всех, кто был добавлен в эту группу с помощью механизма, отличного от плоских файлов UNIX (например, LDAP, NIS, pam-pgsql и т. д.).
Если бы мне абсолютно необходимо было сделать это самому, я бы, вероятно, сделал это наоборот: используйте
id
для получения групп каждого пользователя в системе (который будет извлекать все источники, видимые для NSS) и используйте Perl или что-то подобное для поддержания хэша таблица для каждой обнаруженной группы, отмечающая членство этого пользователя.Изменить: Конечно, это оставляет вас с похожей проблемой: как получить список каждого пользователя в системе. Поскольку мое местоположение использует только плоские файлы и LDAP, я могу просто получить список из обоих местоположений, но это может или не может быть правдой для вашей среды.
Изменить 2: Кто-то мимоходом напомнил мне, что
getent passwd
вернет список всех пользователей в системе, включая пользователей из LDAP / NIS / и т. Д., Ноgetent group
все равно будет по-прежнему скучать по пользователям, которые являются членами только через запись группы по умолчанию, так что это вдохновило меня на напиши этот быстрый взлом.источник
getent passwd
могут не работать (если, например, вы используете sssd).getent passwd
я бы посчитал это ошибкой в sssd.Он переносим как в Linux, так и в Solaris и работает с локальными файлами групп / паролей, конфигурациями NIS и LDAP.
источник
Используйте Python для вывода списка участников группы:
См. Https://docs.python.org/2/library/grp.html.
источник
источник
Следующая команда выведет список всех пользователей, принадлежащих
<your_group_name>
, но только тех, кто управляется/etc/group
базой данных, но не LDAP, NIS и т. Д. Она также работает только для вторичных групп , она не будет перечислять пользователей, для которых эта группа установлена в качестве основной, поскольку основная группа хранится какGID
(числовой идентификатор группы) в файле/etc/passwd
.источник
Следующая команда выведет список всех пользователей, принадлежащих
<your_group_name>
, но только тех, кто управляется/etc/group
базой данных, но не LDAP, NIS и т. Д. Она также работает только для вторичных групп , она не будет перечислять пользователей, для которых эта группа установлена в качестве основной, поскольку основная группа хранится какGID
(числовой идентификатор группы) в файле/etc/passwd
.источник
Следующий скрипт оболочки будет перебирать всех пользователей и печатать только те имена пользователей, которые принадлежат данной группе:
Пример использования:
Примечание: Это решение будет проверять NIS и LDAP для пользователей и групп (не только
passwd
иgroup
файлов). Также будут учитываться пользователи, не добавленные в группу, но имеющие группу, установленную в качестве основной группы.Изменить: Добавлено исправление для редкого сценария, когда пользователь не принадлежит к группе с тем же именем.
Редактировать: написано в виде сценария оболочки; добавлено
true
для выхода со0
статусом, предложенным @Max Chernyak aka hakunin ; отбрасываетсяstderr
, чтобы пропустить те случайныеgroups: cannot find name for group ID xxxxxx
.источник
; true
. Возвращать 0 - это хорошо, чтобы избежать отключения вашей системы управления конфигурацией (Chef, Ansible и т. Д.).Вы можете сделать это в одной командной строке:
Команда выше перечисляет всех пользователей, имеющих имя группы в качестве основной группы
Если вы также хотите перечислить пользователей, имеющих имя группы в качестве своей вторичной группы, используйте следующую команду
источник
grep
будет соответствовать пользователю, чье имя содержит номер группы (например,sc0tt
будет отображаться как частьroot
группы). Если это проблема, используйте регулярное выражение:$(getent group <groupname> | cut -d: -f3)\$
(соответствует точке с запятой, идентификатору группы и концу строки). (Не добавляйте цитаты к регулярному выражению, или Баш жалуется.)просто немного grep и tr:
источник
Реализация Zed, вероятно, должна быть расширена для работы на некоторых других основных UNIX.
Кто-то имеет доступ к оборудованию Solaris или HP-UX ?; не проверял эти случаи.
Если есть лучший способ поделиться этим предложением, пожалуйста, дайте мне знать; Я рассмотрел много способов, и это то, что я придумал.
источник
id -Gn
на/usr/xpg4/bin/id -G -n
Я сделал это аналогично приведенному выше коду perl, но заменил getent и id на собственные функции perl. Это намного быстрее и должно работать с различными * nix-версиями.
источник
Существует удобный пакет Debian и Ubuntu, называемый ' members ', который обеспечивает эту функциональность:
источник
Это возвращает разделенный пробелами список пользователей, которые я использовал в скриптах для заполнения массивов.
или
источник
Вот скрипт, который возвращает список пользователей из / etc / passwd и / etc / group, он не проверяет NIS или LDAP, но показывает пользователей, у которых эта группа является их группой по умолчанию Протестировано на Debian 4.7 и solaris 9
или как однострочник вы можете вырезать и вставлять прямо отсюда (измените имя группы в первой переменной)
источник
В UNIX (в отличие от GNU / Linux) есть команда listusers. См. Справочную страницу Solaris для пользователей списков .
Обратите внимание, что эта команда является частью проекта Heirloom с открытым исходным кодом . Я предполагаю, что это отсутствует в GNU / Linux, потому что RMS не верит в группы и разрешения. :-)
источник
NAME listusers - print a list of user logins SYNOPSIS listusers [-g groups] [-l logins] DESCRIPTION Listusers prints the name and the gecos information of all users known to the system, sorted by username. Valid options are: -g groups Only print the names of users that belong to the given group. Multiple groups are accepted if separated by commas. -l logins Print only user names that match logins. Multiple user names are accepted if separated by commas.
Вот очень простой сценарий awk, который учитывает все распространенные ошибки, перечисленные в других ответах:
Я использую это с моей настройкой с поддержкой ldap, работаю на любом, совместимом со стандартами getent & awk, включая solaris 8+ и hpux.
источник
Это имеет 3 части:
1 -
getent group groupname
показывает строку группы в файле "/ etc / group". Альтернативаcat /etc/group | grep groupname
.2 -
awk
печатать только элементы в одной строке, разделенные символом ','.3 -
tr
заменить ',' на новую строку и напечатать каждого пользователя подряд.4 - Необязательно: Вы также можете использовать другой канал с
sort
, если пользователей слишком много.С уважением
источник
Я думаю, что самым простым способом являются следующие шаги, вам не нужно устанавливать какой-либо пакет или программное обеспечение:
Во-первых, вы узнаете 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º), которую вы выбрал.
источник
Вот еще один однострочник Python, который учитывает членство пользователя в группе по умолчанию (из
/etc/passwd
), а также из базы данных группы (/etc/group
)источник
Я пытался
grep 'sample-group-name' /etc/group
, что будет перечислять всех членов группы, которую вы указали на основе примера здесьисточник
/etc/group
есть как минимум в 3 других ответах, какую ценность ваш ответ добавляет к ним? Кроме того, все остальные ответы содержат комментарии о том, что такое решение работает только для вторичных групп, а также не для учетной записи, управляемой LDAP, NIS и т. Д.