Linux: группы против групп


12

Кто-нибудь знает, почему команда Linux

    groups 

показывает другой вывод, чем

    groups username 

Зарегистрированный пользователь совпадает с параметром 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
В этом вопросе так много дубликатов, что я даже не знаю, с чего начать.
user1686

Ответы:


12

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


3

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


groupsне дает текущего членства, а скорее того, которое было «текущим» в тот момент, когда вызывался процесс входа в систему (/ sbin / login, gdm, sshd) initgroups().
user1686

1

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

Причина, по которой они отличались, заключалась в том, что вы добавили себя в новую группу, членом которой вы не были, когда запускали компьютер.


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

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.