将主机名解析为IP地址的便携方式

NO_*_*AME 10 dns shell sh

我需要在shell脚本中将主机名解析为IP地址.代码必须至少工作中Cygwin,UbuntuOpenWrt(busybox).可以假设每个主机只有一个IP地址.

例:

编辑: nslookup似乎是一个很好的解决方案,但它的输出是非常不可预测的,很难过滤.这是我的计算机上的结果命令(Cygwin):

>nslookup google.com
Unauthorized answer:
Serwer:  UnKnown
Address:  fdc9:d7b9:6c62::1

Name:   google.com
Addresses:  2a00:1450:401b:800::200e
          216.58.209.78
Run Code Online (Sandbox Code Playgroud)

Ant*_*ica 5

我没有使用OpenWRT或Busybox的经验,但是下面的单行将适用于Cygwin或Ubuntu的基本安装:

ipaddress=$(LC_ALL=C nslookup $host 2>/dev/null  | sed -nr '/Name/,+1s|Address(es)?: *||p')
Run Code Online (Sandbox Code Playgroud)

以上适用于nslookup的Ubuntu和Windows版本.但是,它仅在DNS服务器回复一个 IP(v4或v6)地址时有效; 如果返回多个地址,则将使用第一个地址.


说明

LC_ALL=C nslookupLC_ALL在运行nslookup命令时设置环境变量,以便命令忽略当前系统区域设置并以命令的默认语言(英语)打印其输出.

2>/dev/null具有与Windows版本的警告,避免了nslookup被打印有关非权威的服务器.

sed命令查找包含的行Name,然后Addresses:在有多个IP(v4或6)地址的情况下剥离短语后,或者Address:当名称服务器只返回一个地址时,打印以下行.

-n选项意味着不打印行,除非有p命令while the-r`选项意味着使用扩展正则表达式(GNU sed是Cygwin和Ubuntu的默认值).


Cha*_*ffy 4

如果您想在几乎所有现代UNIX上都可以使用现成的东西,请使用Python:

pylookup() {
  python -c 'import socket, sys; print socket.gethostbyname(sys.argv[1])' "$@" 2>/dev/null
}

address=$(pylookup google.com)
Run Code Online (Sandbox Code Playgroud)

对于专用工具,使用起来dig要容易得多nslookup,而且它的short模式只发出文字答案 - 在这种情况下,就是IP地址.要仅获取第一个地址,如果找到多个地址:

# this is a bash-specific idiom
read -r address < <(dig +short google.com | grep -E '^[0-9.]+$')
Run Code Online (Sandbox Code Playgroud)

如果您需要使用POSIX sh或破坏版本的bash(例如使用mingw构建的Git Bash,其中进程替换不起作用),那么您可以使用:

address=$(dig +short google.com | grep -E '^[0-9.]+$' | head -n 1)
Run Code Online (Sandbox Code Playgroud)

digbind-utils包中可以使用cygwin ; 作为bindUNIX上使用最广泛的DNS服务器bind-utils(由相同的代码库构建)也可用于几乎所有的Unix系列操作系统.

  • 是的,但是对于每个操作系统和发行版来说,什么是开箱即用或者不开箱即用,这就是为什么我需要问:对于您关心的平台,默认情况下Python是否可用? (2认同)