有几个命令行实用程序可以parsing主机名( host
, dig
, nslookup
),但是它们全部使用名称服务器,而通常应用程序首先在/etc/hosts
查找(我相信使用gethostbyname)。
是否有一个命令行实用程序来parsing主机名称的行为像一个正常的应用程序,因此看在/etc/hosts
,然后才问一个名称服务器?
(我知道它可能像c的3行,但我需要它在一个有点可移植的shell脚本。)
用getent
很容易实现:
getent hosts 127.0.0.1
getent
将查找在nsswitch.conf
configuration的任何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.conf
configuration)。
不要使用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式将不起作用,但这将是一种罕见的情况。