Як я можу дізнатися, які користувачі входять до групи в Linux?


68

Нещодавно я створюю нових користувачів і відношу їх до певних груп. Мені було цікаво, чи є команда, яка показує всіх користувачів, призначених до певної групи? Я намагався використовувати команду 'groups', однак, коли я її використовую, він говорить «groups: not found»


3
Це groupsкоманда. Навряд чи ви цього не маєте на Linux, оскільки він є частиною coreutils.
Томас Дікі

@ThomasDickey Але це можливо - як у деяких NASE.
Томас В.

Відповіді:


43

Ви можете використовувати grep:

grep '^group_name_here:' /etc/group

Це лише перелік додаткових членських груп, а не користувач, який має цю групу як свою основну групу. І він знаходить лише локальні групи, а не групи з мережевої служби, такої як LDAP.


6
Не працює з централізованою аутентифікацією.
Максим Єгорушкін

1
Це може бути дійсно заплутаним, ймовірно, через первинну / вторинну різницю. Я думаю, цього слід уникати на користь. У sudo lid -g {group}мене є система, де ця відповідь перераховує 8 користувачів у групі, тоді як sudo lid -g {group}списки 10.
DKroot

Дивіться getentвідповідь @Murray Jensen нижче
scrutari

84

Я вважаю за краще використовувати команду getent ...

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

Тож для групи слід використовувати наступне ...

getent group name_of_group

де name_of_group замінено на групу, яку потрібно шукати. Зауважте, що це лише повертає додаткове членство в групі, воно не включає користувачів, які мають цю групу як свою основну групу.

Є цілий ряд інших пошукових запитів, які ви можете зробити ... passwdще один корисний, який вам знадобиться для переліку первинних груп.


1
Інші відповіді не застосовуються, якщо ви не адміністратор, а інформація про групу зберігається на іншому сервері.
Andrés Alcarraz

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

Якщо ви отримаєте "групи: команда не знайдена", ймовірно, ви відредагували свій екологічний шлях на гірше, щоб скинути свій шлях PATH=$(getconf PATH)


Він працює для певної групи , якщо | 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

перераховує всіх користувачів у названій групі.


Зауважте, що groupmemsце частина тіньових утиліт, що використовуються в більшості дистрибутивів Linux, однак groupmemsнаразі відсутня у Debian та похідних ( помилка тепер виправлена, але ще не включена до жодної версії (станом на листопад 2016 року))
Stéphane Chazelas

2
Також зауважте, що groupmemsстосується лише груп у /etc/group(не тих, які є в LDAP або іншої бази даних користувачів) і вимагає привілеїв суперпользователя при спробі відкрити / etc / gshadow.
Стефан Шазелас

Незважаючи на вищезазначені застереження, ця команда ідеально підходить для певних ситуацій, оскільки не потребує додаткового розбору результатів (тобто cutта друзів).
bonh

Це може бути дійсно заплутаним, ймовірно, через первинну / вторинну різницю. Я думаю, цього слід уникати на користь sudo lid -g {group}. У мене є система, де ця відповідь перераховує 8 користувачів у групі, тоді як sudo lid -g {group}списки 10.
DKroot

5

Я здивований, що ніхто не згадав

id <user>

Ця команда подасть список груп, у яких знаходиться користувач.


3
Тому що - всупереч заголовку - запитуючий хотів знати користувачів у межах певної групи, а не групи певного користувача, як це детально описано в питанні. Зараз я перефразував заголовок, щоб він відповідав вмісту.
Дубу

Ааа, бачу. Я мав би краще прочитати текст питання. Дякую.
Олексій

4

groupsкоманда друкує членство групи для користувача. Ви можете використовувати lidкоманду для списку користувачів у такій групі, як:

# lid -g <groupname>

4
lidє частиною libuser, яка не встановлена ​​за замовчуванням у багатьох дистрибутивах.
Кріс Даун

2

OP сформулював питання, щоб виключити можливість використання команди групи . Оскільки це є частиною coreutils в Linux, або (a) його було видалено, або (b) OP неправильно вводить ім'я.

ОП міг би використовуватись 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 -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

На відміну від прийнятої відповіді @ARG, ця команда перераховує користувачів, які мають <groupname> в якості основної групи
Bhavik

це має бути прийнята відповідь
Микола Ненов

1
Я не погоджуюсь. Оскільки він читає користувачів у / etc / passwd, це не працюватиме з іншими модулями nsswitch, які отримують доступ до LDAP тощо.
Іван Вучиця

sudo lid -gНеправильно працювало для мене: я отримав 4 учасників у групі, тоді як списки 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

Він працював правильно в моїй системі на відміну від відповідей, що включають getentчи '^group_name_here:' /etc/group
греп

0

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

ypcat passwd | cut -d: -f1,4 | grep $(getent group <groupname> | cut -d: -f3) | cut -d: -f1
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.