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

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

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

Переехал сюда с https://stackoverflow.com/questions/20211326/is-there-a-standard-command-line-tool-to-do-a-hostname-lookup

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

2 ответа2

3

Традиционный инструмент для поиска имени хоста - это nslookup from bind, но он заменяется на dig. оба инструмента специфичны для DNS и не используют nsswitch. getent hosts использует nsswitch, но используется гораздо реже.

0

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/).*$//'
  )
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .