如何从 Amazon 主机名中提取 IP 地址?

如何从 Amazon 主机名中提取 IP 地址?

我真的不知道为什么,但 Amazon Web Services 为我的机器提供了一些奇怪的主机名。现在我需要用 Knife 列出所有主机名,以便在 Bash 脚本中使用。我说这些 IP 很奇怪,因为没有地方可以解析主机名,但这毕竟是没用的。

在我的脚本中,我只想从主机名中提取 IP。例如,从以下主机名中提取 10.114.152.134:

ip-10-114-152-134.valter.henrique.com

我怎样才能做到这一点?

答案1

这段代码肯定可以改进,但它应该可以完成工作:

hostname=ip-10-114-152-134.valter.henrique.com
hostip=$(echo ${hostname%%.*} | sed -e 's/ip-//' -e 's/-/./g')

${hostname%%.*}删除第一个 ; 之后的所有内容(包括该内容).sed然后删除开头ip-并将破折号替换为点。


您也可以只使用一个sed命令:

echo ip-10-114-152-134.valter.henrique.com | sed 's/ip-\(.*\)-\(.*\)-\(.*\)-\(.*\)\.valter\.henrique\.com/\1.\2.\3.\4/'

第一个括号中的正则表达式(您需要转义这些:) \(.*\)被分配给\1等等。


这是最后一种变体,仅使用 bash 函数:

IFSsave="$IFS"; IFS=-                            # save IFS prior modifying it
hostip=""
hostname=ip-10-114-152-134.valter.henrique.com   # initial values
hostname=${hostname#*-}                          # remove the "ip-" part
hostname=${hostname%%.*}                         # remove the ".valter.henrique.com" part
for i in $hostname; do                           # loop over 10-114-152-134, splitted at "-" ($IFS)
   hostip="${hostip}${i}."                       # append number. to $hostip
done
hostip=${hostip%.}                               # remove trailing dot
echo $hostip                                     # print resulting IP
IFS="$IFSsave"                                   # restore IFS

答案2

这比 mpy 的仅限 Bash 的变体更不强大,因为它假设 IP 地址部分始终位于同一位置,但它更短一些,速度更快一些。

hostname=ip-10-114-152-134.valter.henrique.com
IFSsave=$IFS
IFS=.-
parts=($hostname)
hostip="${parts[*]:1:4}"
IFS=$IFSsave
echo "$hostip"

在引号内使用*数组下标会导致将的第一个字符IFS插入数组的每个元素之间。设置IFS为两个字符会导致在任意一个字符处进行拆分。

顺便说一下,该域名对我来说解析如下:

$ host ip-10-114-152-134.valter.henrique.com
ip-10-114-152-134.valter.henrique.com has address 208.91.197.27

地址 10.114.152.134 是私有 IP,无法通过互联网路由。它可能只能在 AWS 网络内访问。

相关内容