Как напечатать список пользователей и групп в FreeBSD?

Вопрос или проблема

Как вывести список пользователей и групп в FreeBSD?

Пользователи и группы хранятся в /etc/group и /etc/passwd. Для вывода:

awk -F":" '{print $1}' /etc/passwd
awk -F":" '{print $1}' /etc/group

для более подробной информации

awk -F":" '{print $0 $1 $2}' /etc/passwd
  • Разработчики операционной системы FreeBSD признали, что /etc/passwd является

    • часто используемым файлом (каждый раз, когда кто-то входит в систему, вы выполняете ls [если не отключено разрешение числовых идентификаторов] или подобную операцию)
    • который может быть довольно большим (как тысячи пользователей)

    и поэтому будет разумно оптимизировать доступ на чтение. Поэтому с версии FreeBSD 2.0 (выпущенной в 1994 году) файл passwd хранится в формате Berkeley DB по адресу /etc/pwd.db. Этот файл, однако, не является читаемым для человека. Для обратной совместимости (и отчасти для людей) текстовый файл базы данных /etc/passwd все еще генерируется pwd_mkdb утилитой, но он уже не является необходимым для правильного функционирования базовой системы. Файл /etc/group не следует этой схеме.

  • Если вы обеспечите, чтобы /etc/passwd был актуален (т. е. вы исключительно используете pw [или vipw] для управления пользователями, что неявно вызывает pwd_mkdb), вы можете напрямую использовать утилиты текстовой обработки, такие как awk, как уже представил ooshro. В противном случае вам нужно сначала развернуть формат Berkeley DB (= преобразовать в текст). Это можно сделать с помощью FreeBSD утилиты pw:

    pw usershow -a   # -a обозначает всех
    

    Аналогично есть подкоманда для /etc/group, хотя эта база данных (на версии FreeBSD 14.1) не хранится в формате Berkeley DB.

    pw groupshow -a   # также распознаются `user show` и `group show`
    

    Объединяя оба списка (в { … ; } содержится список) и применяя некоторую косметическую фильтрацию:

    { pw usershow -a ; pw groupshow -a ; } | cut -d':' -f1 \
                                           | sort -u \
                                           | tr '\n' ' ' \
                                           | fmt
    

    Команда cut разбивает текст на поля, используя двоеточие в качестве разделителя полей (-d':'), и выводит только первое поле (-f1). sort затем выполняет сортировку в алфавитном порядке и выводит только уникальные строки (-u). Команда tr объединяет все в одну длинную строку, а fmt обрезает эту длинную строку до разумной длины.

  • Тем не менее, pw работает только с локальными пользователями/группами. Она проверяет только файлы в /etc (или в каталоге, указанном через параметр -V, доступный с версии FreeBSD 3.4). В среде с централизованным управлением пользователями/группами, распределенными через сеть, у вас могут быть другие источники данных, определенные в /etc/nsswitch.conf (переключатель служб имен). Замените pw на getent, чтобы получить полный список:

    { getent passwd ; getent group ;     } | cut -d':' -f1 \
                                           | sort -u \
                                           | tr '\n' ' ' \
                                           | fmt
    

    Утилита getent уважает /etc/nsswitch.conf, поэтому пользователи и группы из других источников, таких как каталог LDAP, также перечисляются.

  • Вы можете задаться вопросом, для чего нужен флаг -u для sort. Это довольно распространенный шаблон иметь одну группу для (почти) каждой учетной записи пользователя (особенно для каждой учетной записи пользователя, используемой людьми в качестве основной учетной записи для входа); так у вас есть пользователь eonil и также группа с именем eonil. Если вывод выводится на ваш терминал (в отличие от обычного текстового файла), вы, возможно, захотите выделить пользователей, у которых есть группа с тем же именем:

    {
        getent passwd
        getent group
    } | cut -d':' -f1 | sort | uniq -c | while read -r count identifier
    do
        # Мы ненужным образом выводим команду Сброса графического представления на ноль, чтобы
        # количество символов, определяемое с помощью `fmt`, было сбалансировано по строкам.
        [ ${count:?} -gt 1 ] && tput bold || tput sgr0
        printf '%s' "${identifier:?}"
        tput sgr0
        printf ' '
    done | fmt -w $((2 * $(tput cols)))
    

    Опция -c инструктирует uniq, чтобы предшествовать каждой строке с количеством вхождений перед удалением дубликатов. Если идентификатор присутствует и в выводе getent passwd, и в getent group, количество больше одного.

: pwd.db — это читаемая версия, /etc/spwd.db также содержит хэши паролей.
: Хотя NIS (Служба сетевой информации) создает файлы Berkeley DB для всех своих баз данных.

Ответ или решение

Как напечатать список пользователей и групп на FreeBSD: Полное руководство

Введение

FreeBSD – это мощная и надежная операционная система, часто используемая в серверных средах. Вопрос управления пользователями и группами является важным аспектом администрирования системы. Пользователи и группы хранятся в файлах /etc/passwd и /etc/group, и понимание того, как извлечь эту информацию, может существенно упростить управление системой.

Получение списка пользователей и групп

  1. Получение списка пользователей:
    Для извлечения списка пользователей вы можете воспользоваться командой awk. Используя разделитель : (двоеточие), вы сможете получить только имена пользователей из файла /etc/passwd. Команда будет выглядеть следующим образом:

    awk -F":" '{print $1}' /etc/passwd
  2. Получение списка групп:
    Аналогично, чтобы получить список групп, вы можете использовать следующую команду:

    awk -F":" '{print $1}' /etc/group
  3. Дополнительная информация о пользователях:
    Если вы хотите получить более детальную информацию о пользователях, вы можете напечатать всю строку в /etc/passwd, а также конкретные поля, используя:

    awk -F":" '{print $0}' /etc/passwd

Оптимизация и использование pw

С версии FreeBSD 2.0, чтобы оптимизировать доступ к пользователям, система использует базу данных Berkeley DB, что делает файл /etc/passwd нечитабельным для человека. Для управления пользователями рекомендуется использовать команду pw, которая предоставляет удобный способ отображения информации о пользователях:

  • Для отображения всех пользователей используйте:

    pw usershow -a
  • Для получения информации о группах аналогично:

    pw groupshow -a

Объединение списков пользователей и групп

Если вы хотите получить уникальный список пользователей и групп, вы можете объединить команды, используя следующую конструкцию:

{ pw usershow -a; pw groupshow -a; } | cut -d':' -f1 | sort -u | tr '\n' ' ' | fmt

Здесь cut используется для извлечения первого поля, sort для сортировки и исключения дубликатов, а fmt помогает отформатировать вывод.

Сетевые пользователи и группы

Управление пользователями может также вводить в учет пользователей, которые хранятся в сетевых источниках, например, в LDAP. В этом случае лучше использовать утилиту getent, которая учитывает конфигурацию /etc/nsswitch.conf и позволяет получить полный список пользователей:

{ getent passwd; getent group; } | cut -d':' -f1 | sort -u | tr '\n' ' ' | fmt

Выделение пользователей и групп с одинаковыми именами

Чтобы визуально выделить пользователей, у которых есть группы с одинаковыми именами, используйте следующую команду:

{
    getent passwd; getent group;
} | cut -d':' -f1 | sort | uniq -c | while read -r count identifier
do
    [ ${count:-0} -gt 1 ] && tput bold || tput sgr0
    printf '%s' "${identifier}"
    tput sgr0
    printf ' '
done | fmt -w $((2 * $(tput cols)))

Эта команда подсчитывает количество упоминаний каждого идентификатора и настраивает вывод в соответствии с ним.

Заключение

Знание методов управления пользователями и группами в FreeBSD является неотъемлемой частью администрирования системы. Используя команды awk, pw, и getent, вы можете эффективно получать необходимую информацию о пользователях и группах, как локальных, так и сетевых. Рекомендованные способы позволяют вам поддерживать актуальность базы данных пользователей и препятствовать возможным проблемам при их управлении.

Оцените материал
Добавить комментарий

Капча загружается...