Linux命令行实用程序首先使用/ etc / hostsparsing主机名

有几个命令行实用程序可以parsing主机名hostdignslookup ),但是它们全部使用名称服务器,而通常应用程序首先在/etc/hosts查找(我相信使用gethostbyname)。

是否有一个命令行实用程序来parsing主机名称的行为像一个正常的应用程序,因此看在/etc/hosts ,然后才问一个名称服务器?

(我知道它可能像c的3行,但我需要它在一个有点可移植的shell脚本。)

getent很容易实现:

 getent hosts 127.0.0.1 

getent将查找在nsswitch.confconfiguration的任何types的数据。

一个可以工作的工具是getent 。 所以你可以使用getent hosts www.google.com ,或getent hosts localhost 。 它将按照名称服务交换机configuration/etc/nsswitch.conf规定从数据库中检索条目。

resolveip将做到这一点。

奇怪的是,它是RHEL和Ubuntu上的mysql-server软件包的一部分。

你可以用[你最喜欢的语言]来编写一个调用getnameinfo的脚本。 这就是二进制文件(如ping)应该如何做,所以你可以确保你得到同样的待遇。

你可以使用一个gethostbyname()(不build议使用)包装器,如:

 python -c 'import socket;print socket.gethostbyname("www.google.com")' 

或者像getaddrinfo()这样的包装器:

 python -c 'import socket;print socket.getaddrinfo("www.google.com","http")[0][4][0]' 

请注意,getaddrinfo将以列表forms返回所有实例。 命令的最后部分只select第一个元组。 这也可以返回IPv6地址。

使用getent ahosts ,例如:

 $ getent ahosts www.google.com | sed -n 's/ *STREAM.*//p' 216.58.210.196 2a00:1450:4006:803::2004 

您将通过glibcparsing器获取所有IPv4和IPv6地址(因此首先使用/etc/hosts ,通常在/etc/nsswitch.confconfiguration)。

不要使用getent hosts ,因为它会给你IPv6或IPv4地址(不是两者),并且所select的协议可能不是一个不起作用的协议。 事实上,IPv6地址通常是首选,但在某些地方,IPv6数据被路由器过滤(不支持)。

“gethostbyname” 命令行版本 :

 #!/usr/bin/perl use Socket; $host = shift @ARGV; die("usage: gethostbyname hostname\n") unless(defined($host)); $packed_ip = gethostbyname($host); if (defined $packed_ip) { $ip_address = inet_ntoa($packed_ip); print "$ip_address\n"; exit 0 } else { warn "$host not found\n"; exit 1 } 

你可能真的很黑,并使用arp

 arp -n somehostname | tr -d '()' | awk '{print $2}' 

但那真的很丑,所以你不应该这样做。

getent hosts坏了。 它更喜欢IPv6地址, gai.conf应该configuration为偏好ipv4,但….

Perl gethostbyname使用/etc/nsswitch.conf的优先级

 hosts: files dns 

所以这就像getent hosts应该为我工作。

也:

 perl -e 'use Socket; print inet_ntoa(inet_aton("www.google.com")) . "\n";' 

应该工作。

尝试这个:

 if [ `grep -c "hostname" /etc/hosts` -ge 1 ]; then ip=`awk '/hostname/ { print $1 }' /etc/hosts` else ip=`host hostname | awk '/hostname has address/ { print $4 }'` fi 

以下命令将通过DNS / etc / hosts通过直接DNS服务器查找执行查找。

 ping -W2 -c1 google.com | grep PING | sed -r "s/^[^\(]*\(([\.0-9]*)\).*/\1/" 

这个命令将尝试ping一个域(在这种情况下,google.com)一次,等待超时2秒,获取PING命令的第一行,它将声明“PING google.com(216.58.199.36)56(84 )字节的数据“,然后使用stream编辑器(sed)来检测第一组括号,并提取其中的数据,这是我们正在寻找的IP地址。

注意:如果URL中有圆括号(又名圆括号),那么正则expression式将不起作用,但这将是一种罕见的情况。