Під час запуску він шукає 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буде породжено оболонку оновленим списком груп.