Существует ли стандартный инструмент командной строки для поиска имени хоста?

Существует ли стандартный инструмент командной строки для поиска имени хоста?

Я нахожусь в оболочке и хочу узнать соответствующий IP-адрес(а) для имени хоста.

Я знаю, что могу сделать это с помощью Perl, PHP, Python или ряда других языков программирования (возможно, даже awk!), и это будет моим обходным путем, но я удивлен, что, похоже, нет инструмента командной строки, который мог бы это сделать, нет простой оболочки вокруг getaddrinfo().

Я не прав? Есть ли такой? host, digи getentне в счёт, мне нужно что-то, что использует libc и действует в соответствии с /etc/nsswitch.conf, и что-то, что, вероятно, установлено в любой (linux) системе по умолчанию.

Переехал сюда изhttps://stackoverflow.com/questions/20211326/есть-стандартный-инструмент-командной-строки-для-поиска-имени-хоста

Ответ: Я ошибался, getentон не ищет только в /etc/hosts, он на самом деле выполняет правильный поиск.

решение1

Традиционным инструментом для поиска имен хостов является nslookup из bind, но его заменяют на dig. Оба инструмента специфичны для DNS и не используют nsswitch. Getent Hosts использует nsswitch, но используется гораздо реже.

решение2

getentЭто, безусловно, подходящий инструмент для работы, но, к сожалению, он не везде доступен, и одной из причин этого является то, что он не обязательно должен быть неопределенным в POSIX.

С другой стороны, хотя это не указано в стандарте, arpмаловероятно, что оно не будет доступно на любом сервере, который выполняет разрешение имен. Как arpуказано ниже nsswitch.conf, использует только libc, доступно на любой системе Linux/Unix и обеспечивает вывод, который, по-видимому, соответствует реализациям, разбор его вывода сделает эту работу:

$ arp stackoverflow.com | sed -e 's/.*(//' -e 's/).*$//'
198.252.206.16

Вот функция оболочки, которая использует этот метод, избегая проблемы с Linux arp, которая переключается на другой формат вывода в некоторых критических случаях:

resolve()
{
  : ${1:?Usage: resolve name}
  (
    PATH=$PATH:/usr/sbin
    ao=$(arp $1)
    [ "$(echo "$ao"|grep HWaddress)" ] && ao=$(arp -a $1)
    echo "$ao" | sed -e 's/.*(//' -e 's/).*$//'
  )
}

Связанный контент