Когда вы запускаете , он ищет 1 данного пользователя в и (хотя это может быть LDAP, NIS или что-то еще 2 ) и показывает все найденные группы.groups username/etc/passwd/etc/group
С другой стороны, когда вы запускаете groupsкоманду без каких-либо аргументов, она просто перечисляет все группы, к которым она сама принадлежит 3 - что не обязательно совпадает с тем, что указано в /etc/group. (См. Объяснение ниже.) Фактически, единственный поиск сделан /etc/groupдля перевода GID в имена групп.
Каждый процесс имеет набор учетных данных , который содержит (среди прочего) «реальный идентификатор группы» (первичный 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процесс будет принадлежать к тем же группам, что и вы, когда вы вошли в систему , а не к той базе данных, в которой вы говорите.
Примечание. Приведенное выше объяснение также применимо практически ко всем Unix; к семейству 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появится оболочка с обновленным списком групп.