使用 Unix shell 从主机名获取 IP 地址的简单方法

Alb*_*ert 13 unix shell ip hostname

从主机名获取 IP 地址的最简单方法是什么?

我正在考虑尝试 aping并从输出中解析它。但是,这看起来不太好,并且可能不会在所有系统上都以相同的方式工作。

我四处搜索并找到了解决方案nslookup,但这不适用于/etc/hosts.

小智 13

host <hostname>

前任:

serv ~ $ host stackoverflow.com
stackoverflow.com has address 69.59.196.211
Run Code Online (Sandbox Code Playgroud)

编辑

在 Linux 上(以及至少一些 OS X 变体),您可以使用resolveip,它是 MySQL 服务器包的一部分:

/etc/hosts:
 ...
 127.0.0.1     localhost localhost.localdomain foo
 ...

serv ~ $ resolveip foo
IP address of foo is 127.0.0.1
Run Code Online (Sandbox Code Playgroud)

  • 请参阅我的编辑 - 您可以尝试 `resolveip`。 (2认同)

Jan*_*nen 10

这个古老的帖子似乎有很多创造性的解决方案。

如果我需要确保也/etc/hosts被访问,我倾向于使用

getent hosts somehost.com

这是有效的,至少如果`/etc/nsswitch.conf' 已经被配置为使用文件(通常是这样)。


Tin*_*ino 7

对于 IPv4,有一个标准程序可以使用解析器(包括 /etc/hosts)开箱即用:

host="localhost"
ip="`gethostip -d "$host"`"
Run Code Online (Sandbox Code Playgroud)

它是 Debian 的一部分,安装它:

apt-get install syslinux
Run Code Online (Sandbox Code Playgroud)

对于 IPv4 以外的其他协议(如 IPv6),我目前不知道类似的工具。更新: 因此,我刚刚编写了一个也能够解析 IPv6 的小工具:

https://github.com/hilbix/misc/blob/master/src/ipof.c

它被认为是快速和肮脏的外壳使用,例如gethostip但也允许 IPv6:

ip="`ipof -6 -- heise.de`"
Run Code Online (Sandbox Code Playgroud)

它也可以交互使用,例如:

ipof -a -d -x -v -h -
Run Code Online (Sandbox Code Playgroud)

HTH


gWa*_*ldo 6

为什么不dig +short hostname

(查询DNS)


Eth*_*her 5

您可以使用标准系统调用来完成此操作。这是 Perl 中的一个示例:

use strict; use warnings;
use Socket;
use Data::Dumper;

my @addresses = gethostbyname('google.com');
my @ips = map { inet_ntoa($_) } @addresses[4 .. $#addresses];
print Dumper(\@ips);
Run Code Online (Sandbox Code Playgroud)

产生输出:

$VAR1 = [
          '74.125.127.104',
          '74.125.127.103',
          '74.125.127.105',
          '74.125.127.106',
          '74.125.127.147',
          '74.125.127.99'
        ];
Run Code Online (Sandbox Code Playgroud)

(在命令行中,相同的脚本可以被写为:perl -MSocket -MData::Dumper -wle'my @addresses = gethostbyname("google.com"); my @ips = map { inet_ntoa($_) } @addresses[4 .. $#addresses]; print Dumper(\@ips)'

您可以在其他语言中类似地执行此操作 - 请参阅系统调用的手册页man -s3 gethostbyname等。