Вопрос или проблема
Как вывести список пользователей и групп в 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
, и понимание того, как извлечь эту информацию, может существенно упростить управление системой.
Получение списка пользователей и групп
-
Получение списка пользователей:
Для извлечения списка пользователей вы можете воспользоваться командойawk
. Используя разделитель:
(двоеточие), вы сможете получить только имена пользователей из файла/etc/passwd
. Команда будет выглядеть следующим образом:awk -F":" '{print $1}' /etc/passwd
-
Получение списка групп:
Аналогично, чтобы получить список групп, вы можете использовать следующую команду:awk -F":" '{print $1}' /etc/group
-
Дополнительная информация о пользователях:
Если вы хотите получить более детальную информацию о пользователях, вы можете напечатать всю строку в/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
, вы можете эффективно получать необходимую информацию о пользователях и группах, как локальных, так и сетевых. Рекомендованные способы позволяют вам поддерживать актуальность базы данных пользователей и препятствовать возможным проблемам при их управлении.