Кто-нибудь знает, почему команда 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
linux
user-accounts
Торстен Нихуес
источник
источник
Ответы:
Когда вы запускаете , он ищет 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
появится оболочка с обновленным списком групп.источник
groups
Сам по себе дает текущее членство в группе владельца процесса. Это может отличаться отgroups <username>
того, изменилась ли groupdb с момента запуска процесса или изменился владелец процесса.источник
groups
не дает текущего членства, а скорее того, которое было «текущим» в тот момент, когда вызывался процесс входа в систему (/ sbin / login, gdm, sshd)initgroups()
.Просто перезагрузите компьютер, и обе группы и группы пользователей должны дать одинаковые результаты.
Причина, по которой они отличались, заключалась в том, что вы добавили себя в новую группу, членом которой вы не были, когда запускали компьютер.
источник
su
, закрытие повторного открытия текущего сеанса). Вы также можете использоватьnewgrp
для запуска процессов с включенной новой группой.Запустите
updatedb
, посмотрите, есть ли какие-либо изменения.То же самое в моей машине OSX, когда groupdb не изменился:
источник