Shell-Script

如何將 dig 輸出寫入 /etc/hosts 文件?

  • May 31, 2020

我是一個shell初學者,這是一個例子,我不知道如何實現它。

任何幫助,在此先感謝!

步驟 1:通過 . 獲取域解析 A 記錄dig

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

第二步:將獲取的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

一種方法基本上是用新的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

找到正好包含“liveproduseast.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

引用自:https://unix.stackexchange.com/questions/590050