Почему выходные данные из `groups` отличаются от` groups user`, если я в данный момент вошел в систему как пользователь?


21

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

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

jacob@box:~$ groups jacob
jacob : jacob

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

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


@ Джейк Попробуйте выйти из системы, а затем снова

1
Я имею эту проблему в обратном порядке. «groups myname» дает мне все группы, которые есть в файле / etc / groups, но выполнение «groups» показывает мне только мою основную группу. И действительно, команды, которые требуют, чтобы я был в определенной дополнительной группе, терпят неудачу из-за отсутствия разрешений. Конечно, я бы знал, что это вызвало.
Тодд Уолтон

Ответы:


11

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

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

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


8

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

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

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

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


3

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

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

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

Процесс входа в систему устанавливает основные и дополнительные группы. В последующем он обычно вызывает initgroups функции 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.

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.