如何在 Bash 脚本中将主机名解析为 IP 地址?

如何在 Bash 脚本中将主机名解析为 IP 地址?

在 Bash 脚本中将主机名解析为 IP 地址的最简洁方法是什么?我在用着架构Linux

答案1

您可以使用getent,它附带glibc(所以您几乎肯定在 Linux 上有它)。这可以使用 gethostbyaddr/gethostbyname2 解决,因此还将检查/etc/hosts/NIS/etc:

getent hosts unix.stackexchange.com | awk '{ print $1 }'

或者,正如 Heinzi 下面所说,您可以使用dig参数+short(直接查询 DNS 服务器,不查看/etc/hosts/NSS/etc):

dig +short unix.stackexchange.com

如果dig +short不可用,则以下任何一项都应该有效。所有这些都直接查询DNS并忽略其他解析方式:

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 }'

如果只想打印一个IP,则将该exit命令添加到awk的工作流程中。

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 }'

答案2

hostdnsutils包裹:

$ host unix.stackexchange.com
unix.stackexchange.com has address 64.34.119.12

已更正包名根据注释。请注意,其他发行版有host不同的软件包:Debian/Ubuntu绑定9主机, 开放SUSE绑定实用程序, 节俭软件绑定.)

答案3

我的机器上有一个工具似乎可以完成这项工作。手册页显示它似乎与 mysql 一起提供...以下是如何使用它:

resolveip -s unix.stackexchange.com
64.34.119.12

如果无法解析主机名,则该工具的返回值不同于 0:

resolveip -s unix.stackexchange.coma
resolveip: Unable to find hostid for 'unix.stackexchange.coma': host not found
exit 2

更新 在 Fedora 上,它带有 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

我想这会给你的脚本创建一个奇怪的依赖关系......

答案4

getent hosts unix.stackexchange.com | cut -d' ' -f1

相关内容