Я нахожусь в оболочке и хочу узнать соответствующий 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/).*$//'
)
}