如何将 dig 输出写入 /etc/hosts 文件?

如何将 dig 输出写入 /etc/hosts 文件?

我是一个shell初学者,这是一个例子,我不知道如何实现它。

任何帮助,提前致谢!

第一步:通过 获取域名解析A记录dig

dig @8.8.8.8 liveproduseast.akamaized.net +short | tail -n1

步骤2:将获得的IP地址和域名组成如下所示的一行。

23.1.236.106 liveproduseast.akamaized.net

步骤3:将其添加到文件的最后一行/etc/hosts

127.0.0.1  localhost loopback
::1        localhost
23.1.236.106 liveproduseast.akamaized.net

第 4 步:将其设置为自动执行任务并每 6 小时运行一次。当解析IP发生变化时,更新到文件中/etc/hosts(替换之前添加的IP)。

crontab -e
6 * * * * /root/test.sh 2>&1 > /dev/null

答案1

一种方法就是用新 IP 替换旧 IP:

$ cat /root/test.sh
#!/bin/sh

current_ip=$(awk '/liveproduseast.akamaized.net/ {print $1}' /etc/hosts)
new_ip=$(dig @8.8.8.8 liveproduseast.akamaized.net +short | tail -n1 | grep '^[.0-9]*$')

[[ -z $new_ip ]] && exit

if sed "s/$current_ip/$new_ip/" /etc/hosts > /tmp/etchosts; then
    cat /tmp/etchosts > /etc/hosts
    rm /tmp/etchosts
fi

在 sed 部分,如果您使用 GNU,您可以简单地执行以下操作:

sed -i "s/$current_ip/$new_ip/" /etc/hosts

或者如果你已经moreutils安装了

sed "s/$current_ip/$new_ip/" /etc/hosts | sponge /etc/hosts

解释

grep '^[.0-9]*$'捕获 IP 地址,如果没有,则不输出任何内容。

awk '/liveproduseast.akamaized.net/ {print $1}' /etc/hosts

找到恰好包含“liveproduseeast.akamaized.net”的行,然后获取其第一列,即 IP。

sed "s/what to replace/replacement/" file

将第一个出现的要替换的内容替换为替换值

值得注意的是,你不能这样做:

sed "s/what to replace/replacement/" file > file

更多细节:https://stackoverflow.com/questions/6696842/how-can-i-use-a-file-in-a-command-and-redirect-output-to-the-same-file-without-t

相关内容