← Весь справочник

getent

Записи о пользователях, группах, хостах и портах так, как их видит система через NSS

getent (get entries) читает «административные базы» — пользователей, группы, хосты, сервисы — через тот же механизм NSS, что и все программы в системе. Поэтому он показывает правду: не только строки из /etc/passwd и /etc/hosts, но и записи из DNS, LDAP, systemd и других источников, если они подключены.

Синтаксис

getent [опции] база [ключ…]

Без ключа печатает всю базу (если она умеет перечисляться). С ключами — только найденные записи, по одной строке на ключ.

Базы

БазаЧто в нейКлючФормат строки
passwdпользователиимя или UIDимя:x:UID:GID:комментарий:домашний_каталог:оболочка
groupгруппыимя или GIDимя:x:GID:участник1,участник2
shadowхеши паролей (только root)имяимя:хеш:дата_смены:мин:макс:предупр:::
gshadowпароли групп (только root)имяимя:хеш:админы:участники
initgroupsвсе группы пользователяимяимя GID1 GID2 …
hostsимя ↔ адрес (gethostbyname)имя или IPадрес имя псевдонимы
ahostsадреса через getaddrinfoимяадрес STREAM|DGRAM|RAW имя
ahostsv4 / ahostsv6то же, только IPv4 / IPv6имякак ahosts
servicesпорты сервисов (/etc/services)имя, порт или порт/протоколимя порт/протокол псевдонимы
protocolsномера IP-протоколовимя или номерtcp 6 TCP
networksимена сетейимяlink-local 169.254.0.0
ethers, rpc, aliases, netgroupреже нужные базы

Список баз, поддерживаемых твоей системой, печатает getent --help в конце.

Опции

ОпцияЧто делает
-s источникспросить только указанный источник NSS, например -s files — только локальные файлы
-Aдля ahosts*: не отбрасывать адреса семейства, которого нет на интерфейсах (по умолчанию ::1 может пропасть)
-iне преобразовывать IDN-имена (кириллические домены)

Коды выхода

КодЗначение
0всё найдено
1неизвестная база или не хватает аргументов
2хотя бы один ключ не найден
3база не умеет перечисляться (запрос без ключа)

Откуда берутся данные: NSS

Для каждой базы /etc/nsswitch.conf задаёт порядок источников:

passwd:   files systemd
hosts:    files dns
services: db files

files — это /etc/passwd, /etc/hosts и т. д.; dns — DNS-резолвер; systemd, ldap, sss — внешние источники. getent идёт по этому списку так же, как ssh, sudo, ls -l и любой другой процесс.

Примеры

# есть ли пользователь — удобно в скриптах: код 0 или 2
getent passwd deploy >/dev/null && echo есть || echo нет

# домашний каталог и оболочка пользователя
getent passwd root | cut -d: -f6,7

# кто по UID 1000
getent passwd 1000 | cut -d: -f1

# участники группы sudo (только «дополнительные», см. подводные камни)
getent group sudo | cut -d: -f4

# все группы пользователя, включая основную, — по GID
getent initgroups ubuntu

# несколько ключей сразу
getent passwd root nobody www-data

# во что резолвится имя — с учётом /etc/hosts И DNS
getent hosts localhost
getent ahostsv4 localhost

# только из /etc/hosts, без DNS
getent -s files hosts myapp.local

# какой порт у сервиса и какой сервис на порту
getent services ssh
getent services 443
getent services 53/udp

# список всех логинов
getent passwd | cut -d: -f1

Подводные камни

  • grep /etc/passwd видит не всех. Пользователи из LDAP/SSSD или systemd в файле не лежат, а getent passwd их покажет. Для проверки существования пользователя бери getent, а не grep.
  • getent hosts спрашивает и DNS, а grep /etc/hosts — только файл. Если имя не резолвится, getent hosts имя воспроизводит именно то, что увидит программа.
  • getent hosts localhost может вернуть ::1, а не 127.0.0.1: эта база сначала ищет IPv6-адрес. Нужен IPv4 — бери getent ahostsv4.
  • ahosts без -A прячет адреса, которые система считает неподходящими (например, ::1 при отсутствии IPv6 на интерфейсах).
  • Поле участников в group не содержит тех, у кого эта группа основная (GID в passwd). Полный список групп одного пользователя даёт getent initgroups или id.
  • getent shadow и gshadow работают только от root. У обычного пользователя вывод будет пустым.
  • Код 2, а не 1, если ключ не найден. В условиях проверяй «не ноль», а не конкретно 1.

См. также

useradd · id · dig · ping · ss · cut