Linux: групи користувачів проти груп


12

Хтось знає, чому команда linux

    groups 

показує інший вихід, ніж

    groups username 

Користувач, який увійшов до системи, такий самий, як і ім'я користувача параметра. Приклад:

    thorsten@ubuntu:~/tmp$ groups
    thorsten adm dialout cdrom plugdev lpadmin admin sambashare
    thorsten@ubuntu:~/tmp$ groups thorsten
    thorsten : thorsten adm dialout cdrom plugdev nogroup lpadmin admin sambashare

1
У цьому питанні стільки дублікатів, що я навіть не знаю, з чого почати.
користувач1686

Відповіді:


12

Під час запуску він шукає 1 даного користувача в і (хоча це може бути LDAP, NIS або щось інше 2 ) і показує всі знайдені групи.groups username/etc/passwd/etc/group

З іншого боку, коли ви запускаєте groupsкоманду без будь-яких аргументів, вона просто перераховує всі групи, до яких вона сама належить 3, - що не обов'язково те саме, що вказано в /etc/group. (Дивіться нижче для пояснення.) Насправді, тільки пошуки зроблені /etc/groupпризначені для перекладу GIDs для імен груп.


Кожен процес має набір облікових даних , який містить (серед іншого) "реальний ідентифікатор групи" (первинний GID), "ефективний ідентифікатор групи" (EGID) та список ідентифікаторів "додаткової групи" (вторинні GID). За замовчуванням процес успадковує свої облікові дані від свого батьківського; однак процесам, що працюють як root (UID 0) або мають CAP_SETUIDможливість встановлювати довільні облікові дані.

Зокрема, коли ви входите в Linux (будь то в tty, X11 або через SSH), процес входу (/ bin / login, gdm, sshd) шукає ваше ім'я користувача, щоб визначити ваш UID, первинний GID та вторинний GID . На персональному комп'ютері, це просто означає , що читання відповідні рядки з passwdі groupфайлів (або NIS, LDAP і т.д.).

Потім процес переходить Ввійти 4 на ці облікові дані перед початком сеансу, і кожен процес запуску тепер матиме такий самий UID і GIDs - система не перевіряє , /etc/groupбільше 5 і не підберуть будь-які зміни , зроблені.

Таким чином, /usr/bin/groupsпроцес буде належати до тих самих груп, що і ви, коли ви входили в систему , а не те, що в базі даних йдеться.

Примітка: Наведене пояснення стосується також майже всіх Unixes; до сімейства Windows NT (крім UID та GID всі називаються "SID", немає "первинної групи", облікові дані називаються "маркер процесу", і CAP_SETUIDце SeCreateTokenPrivilege або SeTcbPrivilege ); і, ймовірно, для більшості інших багатокористувацьких операційних систем.


1 getpwuid () та getgrouplist () використовуються для пошуку груп користувачів.

2 В Linux glibc використовує /etc/nsswitch.confдля визначення місця пошуку цієї інформації.

3 groups використовує getgid (), getegid () та getgroups () для отримання власних облікових даних.

4 setuid (), setgid (), initgroups () та пов'язані з ними.

5 Виняток, звичайно, різні інструменти , які працюють підвищені ( Setuid ) , такі як su, sudo, sg, newgrp, pkexec, і так далі. Це означає, що su $USERбуде породжено оболонку оновленим списком груп.


3

groupsсамостійно дає поточну групову приналежність власника процесу. Це може відрізнятися від того, groups <username>якщо groupdb змінився з моменту запуску процесу або змінився власник процесу.


groupsне дає поточного членства, а скоріше того, яке було "поточним" у той момент, коли викликався процес входу (/ sbin / login, gdm, sshd) initgroups().
користувач1686

1

Просто перезавантажте комп'ютер, і обидва групи та групи повинні дати однакові результати.

Причина, по якій вони відрізнялися, полягала в тому, що ви додали себе до нової групи, до якої не входили, коли запускали комп'ютер.


Вам, звичайно, не потрібно перезавантажувати всю систему! Вам просто потрібно запустити новий сеанс входу (тобто на новій віртуальній консолі, використовуючи su, закривши повторне відкриття поточного сеансу). Ви також newgrpможете запустити процеси із включеною новою групою.
pabouk

1
Я хотів лише дати просте швидке рішення, яке буде працювати щоразу. Є багато інших відповідей, які вже досить детально відповідають на це питання. Іноді те, що люди хочуть, як це було в моєму випадку, - це просте рішення, яке просто працює, не проходячи кілька кроків.
Олексій

0

Біжи updatedb, подивись, чи є якісь зміни.

Те саме в моїй машині OSX, коли groupdb не змінився:

albert-hotspot:~ sami$ groups sami
staff com.apple.access_screensharing com.apple.sharepoint.group.2 everyone _appstore localaccounts _appserverusr admin _appserveradm _lpadmin _lpoperator _developer
albert-hotspot:~ sami$ groups
staff com.apple.access_screensharing com.apple.sharepoint.group.2 everyone _appstore localaccounts _appserverusr admin _appserveradm _lpadmin _lpoperator _developer
albert-hotspot:~ sami$ 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.