/etc/passwd или /etc/hosts приходилось, наверное, каждому инженеру Linux. В статьях, посвящённых DNS, нередко всплывает файл /etc/nsswitch.conf, задающий порядок обращений к источникам DNS-имён. Редко при этом внимание уделяется связям между этими файлами, и в целом самой системе разрешения имён NSS, частью которой они являются.NSS (Name Service Switch) - это механизм, позволяющий централизованно управлять доступными базами имён. Источников имён может быть много: в случае с доменными именами, например, это может быть файл
/etc/hosts, сервис mDNS, "обычный" DNS, и порядок обращений к ним может меняться. Вместо того, чтобы каждый процесс самостоятельно решал, куда обращаться в первую очередь, POSIX предлагает использовать набор стандартных функций, просто позволяющих запросить ответ у операционной системы. Обработка ошибок сервисов и порядок обращений к ним ложится на плечи системных библиотек, поведение которых, в свою очередь, описывается в том самом файле /etc/nsswitch.conf.Что интересно, сервис не ограничивается работой с доменными именами. Помимо них он знает о назначении стандартных сетевых портов, которые обычно слушают популярные сервисы, созданных пользователях, группах пользователей и некоторых других базах, с которыми сталкиваться толком и не приходится. Для обращения к ним из CLI есть команда
getent:# IPv4 of google.com?
$ getent ahostsv4 google.com
142.250.9.138 STREAM google.com
...
# IPv6 of google.com?
$ getent ahostsv6 google.com
2607:f8b0:4002:c11::65 STREAM google.com
...
# User entries for root and mint?
$ getent passwd root mint
root:x:0:0:root:/root:/bin/bash
mint:x:1000:1000:mint:/home/mint:/bin/bash
# Default ports?
$ getent services ssh ntp mail
ssh 22/tcp
ntp 123/udp
smtp 25/tcp mail
В документации getent перечислены доступные базы и указано, какие системные вызовы используются для обращения к ним. К описаниям файлов, задействуемых системными библиотеками в каждом случае, можно выйти по ссылкам в документации к соответствующим системным вызовам.
Команда
getent, как и полный спектр возможностей сервиса NSS, действительно используется нечасто. Сервисы часто запускаются на нестандартных портах, а нужные строки из файла /etc/passwd можно выбрать и при помощи grep. Полезной команда снова оказывается в ограниченных окружениях, где нет привычных сетевых утилит dig, host, ping, curl и любой другой, умеющей разрешать DNS-имена: в подобных случаях утилита getent может спасти ситуацию:$ sudo docker run -it --rm ubuntu
[sudo] password for mint:
root@0e7dbe8b1974:/# curl
bash: curl: command not found
root@0e7dbe8b1974:/# dig
bash: dig: command not found
root@0e7dbe8b1974:/# host
bash: host: command not found
root@0e7dbe8b1974:/# ping
bash: ping: command not found
root@0e7dbe8b1974:/# getent ahosts google.com
209.85.233.139 STREAM google.com
209.85.233.139 DGRAM
209.85.233.139 RAW
209.85.233.101 STREAM
209.85.233.101 DGRAM
209.85.233.101 RAW
...
root@0e7dbe8b1974:/#


