![解析 DNS 时需要在 bash 脚本中将 IP 打印为列表](https://linux22.com/image/206494/%E8%A7%A3%E6%9E%90%20DNS%20%E6%97%B6%E9%9C%80%E8%A6%81%E5%9C%A8%20bash%20%E8%84%9A%E6%9C%AC%E4%B8%AD%E5%B0%86%20IP%20%E6%89%93%E5%8D%B0%E4%B8%BA%E5%88%97%E8%A1%A8.png)
我正在为 terraform 外部数据提供程序编写以下 bash 脚本
# !/bin/bash
echo {\"ip\":\"`nslookup nlb-private-1-6ec90b26d1c9e906.elb.ap-south-1.amazonaws.com | awk '/^Address: / { print $0 }'`\"}
我得到的输出为
ssh_ip_address = "10.20.207.250 10.20.223.249 10.20.191.249"
我想用逗号将此输出分解为列表,因为我想将每个 IP 调用为不同的输出,以便在 terraform 脚本中调用输入。
如果有人能帮忙就太好了
答案1
我假设您希望 JSON 作为输出,并将 IP 地址作为顶级ip
密钥的值。
根据您最终想要的,您可以使用
nslookup nlb-private-1-6ec90b26d1c9e906.elb.ap-south-1.amazonaws.com |
sed -n 's/^Address: //p' |
jq -Rs '{ ip: ( rtrimstr("\n") | split("\n") ) }'
...它使用 删除 IP 地址sed
,然后使用 .read 将这些地址读入 JSON 列表jq
。这会给你
{
"ip": [
"10.20.223.249",
"10.20.191.249",
"10.20.207.250"
]
}
或者用逗号连接这些 IP 地址,
nslookup nlb-private-1-6ec90b26d1c9e906.elb.ap-south-1.amazonaws.com |
sed -n 's/^Address: //p' |
jq -Rs '{ ip: ( rtrimstr("\n") | split("\n") | join(",") ) }'
...这会给你
{
"ip": "10.20.207.250,10.20.223.249,10.20.191.249"
}
您可以将nslookup
and替换sed
为生成一组 IP 地址行的任何命令或管道。例如,您可能想使用 roaima 显示的单个命令他们的答案:
dig +short nlb-private-1-6ec90b26d1c9e906.elb.ap-south-1.amazonaws.com
dig
在和的帮助下jo
:
$ dig +short nlb-private-1-6ec90b26d1c9e906.elb.ap-south-1.amazonaws.com | jo -a | jo ip=:-
{"ip":["10.20.223.249","10.20.207.250","10.20.191.249"]}
答案2
当我运行你的代码时,我没有得到任何像你的输出一样的东西,所以我重新开始。这是一个使用dig
代替的解决方案nslookup
(并分成两行以增加一点额外的可读性)
printf "ssh_ip_address = \"%s\"\n" \
"$(dig +short nlb-private-1-6ec90b26d1c9e906.elb.ap-south-1.amazonaws.com | xargs | tr ' ' ',')"
输出
ssh_ip_address = "10.20.223.249,10.20.207.250,10.20.191.249"
刚刚发现您一直想要 JSON,这里是同一命令的修改版本,它正是执行此操作
printf "{ \"ip\": \"%s\" }\n" \
"$(dig +short nlb-private-1-6ec90b26d1c9e906.elb.ap-south-1.amazonaws.com | xargs | tr ' ' ',')"
输出
{ "ip": "10.20.207.250,10.20.191.249,10.20.223.249" }
答案3
我提出这个解决方案:
$ ips=$(nslookup nlb-private-1-6ec90b26d1c9e906.elb.ap-south-1.amazonaws.com | sed -n '/Address: /s/[^0-9.]*//p')
$ printf '{ "ip": "%s\n' "${ips//$'\n'/,}\" }"
{ "ip": "10.20.207.250,10.20.191.249,10.20.223.249" }
答案4
使用getent
而不是nslookup
or 的解决方案dig
。
$ printf "{ \"ip\": \"%s\" }\n" "$(getent hosts nlb-private-1-6ec90b26d1c9e906.elb.ap-south-1.amazonaws.com | cut -f1 -d' ' | xargs | tr ' ' ',' )"
{ "ip": "10.20.191.249,10.20.223.249,10.20.207.250" }
$