Як я можу дізнатися, які користувачі входять до групи в 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.