Когда вы запускаете , он ищет 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
появится оболочка с обновленным списком групп.