How can I resolve a hostname to an IP address in a Bash script?
You can use getent
, which comes with glibc
(so you almost certainly have it on Linux). This resolves using gethostbyaddr/gethostbyname2, and so also will check /etc/hosts
/NIS/etc:
getent hosts unix.stackexchange.com | awk '{ print $1 }'
Or, as Heinzi said below, you can use dig
with the +short
argument (queries DNS servers directly, does not look at /etc/hosts
/NSS/etc) :
dig +short unix.stackexchange.com
If dig +short
is unavailable, any one of the following should work. All of these query DNS directly and ignore other means of resolution:
host unix.stackexchange.com | awk '/has address/ { print $4 }'
nslookup unix.stackexchange.com | awk '/^Address: / { print $2 }'
dig unix.stackexchange.com | awk '/^;; ANSWER SECTION:$/ { getline ; print $5 }'
If you want to only print one IP, then add the exit
command to awk
's workflow.
dig +short unix.stackexchange.com | awk '{ print ; exit }'
getent hosts unix.stackexchange.com | awk '{ print $1 ; exit }'
host unix.stackexchange.com | awk '/has address/ { print $4 ; exit }'
nslookup unix.stackexchange.com | awk '/^Address: / { print $2 ; exit }'
dig unix.stackexchange.com | awk '/^;; ANSWER SECTION:$/ { getline ; print $5 ; exit }'
With host
from the dnsutils package:
$ host unix.stackexchange.com
unix.stackexchange.com has address 64.34.119.12
(Corrected package name according to the comments. As a note other distributions have host
in different packages: Debian/Ubuntu bind9-host, openSUSE bind-utils, Frugalware bind.)
I have a tool on my machine that seems to do the job. The man page shows it seems to come with mysql... Here is how you could use it:
resolveip -s unix.stackexchange.com
64.34.119.12
The return value of this tool is different from 0 if the hostname cannot be resolved :
resolveip -s unix.stackexchange.coma
resolveip: Unable to find hostid for 'unix.stackexchange.coma': host not found
exit 2
UPDATE On fedora, it comes with mysql-server :
yum provides "*/resolveip"
mysql-server-5.5.10-2.fc15.x86_64 : The MySQL server and related files
Dépôt : fedora
Correspondance depuis :
Nom de fichier : /usr/bin/resolveip
I guess it would create a strange dependency for your script...