When you call ping name.domain, it goes through both /etc/hosts and the DNS resolver to obtain an IP. It could be an IP hard-coded in /etc/hosts, or it could be one from the DNS server. It does so by calling getaddrinfo() or equivalent, not directly, of course.

How do I call getaddrinfo() from shell? How do I reproduce the effect of "normal" net utilities to obtain an IP from an address?

This is not about using dig/host which only go through DNS, or getent which only goes through hosts. I want to reproduce common application behavior (e.g. ping) when it receives a name it needs to resolve. There are other questions about dig/host. This question is not a duplicate of those.

Update: here are my findings (based partly on answers to other Qs)

• on Ubuntu (and Debian?) there is gethostip -d name.domain from syslinux.
• perl -MSocket -le 'print inet_ntoa inet_aton shift' name.domain works reliably and is terser than the accepted answer.
• Using getent may also work: getent ahostsv4 name.domain | grep STREAM | head -1 | cut -f1 -d' '

This seems to be the best one can do.

10
2022-07-25 20:41:44
Source Share