我需要在shell脚本中将主机名解析为IP地址.代码必须至少工作中Cygwin,Ubuntu和OpenWrt(busybox).可以假设每个主机只有一个IP地址.
例:
输入
google.com
Run Code Online (Sandbox Code Playgroud)产量
216.58.209.46
Run Code Online (Sandbox Code Playgroud)编辑:
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)
我没有使用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的默认值).
如果您想在几乎所有现代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系列操作系统.