19

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

jacob@box:~$ groups
jacob adm lp dialout cdrom plugdev lpadmin sambashare

jacob@box:~$ groups jacob
jacob : jacob

Кроме того, что означает "группы текущего процесса" (из справочной страницы группы)? Где они установлены?

ПРИМЕЧАНИЕ: мой дистрибутив - это Ubuntu.

3 ответа3

9

Это может быть одно из следующих:

  • Это может быть ошибка (хотя я сомневаюсь в этом)
  • Вам может потребоваться выйти из системы и войти снова

Группы установлены в /etc/group .

8

Так же, как каждый процесс имеет текущий действительный и эффективный идентификатор пользователя, а также действительный и эффективный идентификатор группы, он также имеет список дополнительных групп. Это числа (а не имена), все поддерживаемые ядром. Они устанавливаются процессом входа в систему (или менеджером отображения), когда вы регистрируете его, как ваш идентификатор пользователя. Они наследуются подпроцессами, как ваш идентификатор пользователя.

Когда вы запускаете groups без аргументов, он в конечном счете вызывает getgroups() для получения списка дополнительных групп из ядра. (В моей системе Linux /usr /bin /groups - это сценарий оболочки, который запускает "id -Gn", который, в свою очередь, вызывает getgroups ().)

Когда вы запускаете groups username , команда должна "угадать", какими будут дополнительные группы, когда этот пользователь войдет в систему. Обычно это делается путем чтения /etc /group или общения с NIS или общения с nscd или ... Ну, есть много способов, которыми это может работать.

То, что вы наблюдаете, похоже на обнаружение того, что ваш текущий реальный идентификатор пользователя и ваша запись в /etc /passwd противоречивы. Это означает, что в конфигурации вашей системы есть что-то немного странное, но трудно сказать, что без дополнительного расследования.

2

(Примечание. Команда groups , хотя и по-прежнему полезна, в основном заменяется командой id.)

У пользователя есть основная группа, которая традиционно определяется в файле /etc/passwd которую он входит, но сегодня у нее могут быть другие источники. Он также может быть членом дополнительных групп, известных как вторичные или дополнительные группы, которые традиционно указываются в файле /etc/groups , но которые сегодня также могут быть получены или подразумеваться из дополнительных источников (таких как NIS, LDAP, SAMBA и т.д.). ,

Основные и дополнительные группы определяются во время входа в систему и остаются актуальными. Однако пользователь может в любое время изменить свою текущую активную первичную группу с помощью команды newgrp .

Процесс входа в систему устанавливает основные и дополнительные группы. В последующем он обычно вызывает функцию initcroups libc, которая составляет список дополнительных данных группы и передает его в функцию setgroups, которая устанавливает его в контексте процесса.

Источниками информации для initgroups являются:

  • /etc/passwd для основного входа
  • /etc/groups для дополнительных групп
  • /etc/nsswitch.conf для источников для дополнительных групп, который описывается как:

используется библиотекой GNU C и некоторыми другими приложениями для определения источников, из которых можно получить информацию службы имен в ряде категорий, и в каком порядке. Каждая категория информации идентифицируется именем базы данных.

Команда groups показывает группы, которые в настоящее время применяются к вашему пользователю, и список начнется с текущей основной группы, за которой следуют дополнительные группы с момента входа в систему. Любые изменения в источниках данных с момента входа в систему не отображаются в отображаемом списке.

Команда groups username просит Linux рассчитать группы для этого пользователя, что она будет делать, используя главным образом файлы /etc/password и /etc/groups а затем дополнительные источники. Это будет отражать текущую ситуацию с системными файлами и может не совпадать с текущими группами , которые действуют с момента входа в систему.

Команда groups username может дать другой результат, если она не использует все источники, используемые процессом входа в систему для вычисления ваших дополнительных групп, что, по-видимому, и произошло в вашем случае. Эти источники могут быть недоступны из вашего логина или просто не могут быть просмотрены командой.

Использование команды id username может дать лучшие результаты, хотя и не гарантирует, что оно будет таким же полным, как в процессе входа в систему. Команда id более поздняя, чем предыдущая, и должна была быть более точной, чем старая команда groups .

Хотя команда groups дает точный и правильный результат, вы хорошо продемонстрировали, что от команды groups username не может зависеть то же самое.

Без изучения исходного кода команды groups я бы предположил, что реализация команды имени groups username в вашем дистрибутиве Linux анализирует /etc/groups , которая в вашем случае ничего не содержит, но не использует /etc/nsswitch.conf , из которого пришли все ваши дополнительные группы. Поэтому в списке указано только имя основной группы, jacob .

Для получения дополнительной информации см .:

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .