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.