我编写了一个脚本(我的第一个脚本),目的是当检测到文件中出现的 IP 与当前外部 IP 不同时替换绑定配置文件中的 IP 地址。我有自己的域,但没有静态 IP 地址,所以这个脚本可以解决问题。
剧本:
#!/bin/bash
###
### Obtains the current external IP, compares it against the defined
### IPs in the bind config file and, if they do not match,
### it modifies them
###
##
## Variables
##
# File to be modified
currfile=/etc/bind/zones/db.nahue.com.ar
# Current external IP
currextip=$(wget http://ipinfo.io/ip -qO -)
# Current bind config file IP
currbindip=$(cut -f6 $currfile | head -15 | tail -1)
# Current serial number
currbindser=$(cut -f 4 $currfile | head -6 | tail -1)
# Current serial number substring
currbindsersub=$(expr substr $currbindser 1 8)
# Same date serial plus one
newserial1=$(expr $currbindser + 1)
# Current date YYYYMMDD
currdate=$(date +%Y%m%d)
# Current date serial format YYYYMMDDXX
newserial=$(date +%Y%m%d)01
if [ "$currextip" != "$currbindip" ]
then
sed -i -e "s:$currbindip:$currextip:g" "$currfile"
if [ "$currbindsersub" = "$currdate" ]
then
sed -i -e "s:$currbindser:$newserial1:g" "$currfile"
else
sed -i -e "s:$currbindser:$newserial:g" "$currfile"
fi
service bind9 restart
exit
else
exit
fi
显然,在某些时候它会出现错误并导致绑定配置文件根本没有 IP 地址。
这是我要修改的配置文件:
;
; bind file for nahue.com.ar
;
$TTL 900
nahue.com.ar. IN SOA ns1.nahue.com.ar. hostmaster.nahue.com.ar. (
2016010403 ;Serial
300 ; Refresh
60 ; Retry
2419200 ; Expire
900 ) ; Negative Cache TTL
; Name servers
@ IN NS dns1-npastorale.no-ip.org.
@ IN NS dns2-npastorale.no-ip.org.
@ IN A 190.245.154.174 ; Script control line
a IN A 190.245.154.174
b IN A 190.245.154.174
c IN A 190.245.154.174
@ IN MX 10 a.nahue.com.ar.
我希望您能帮助我解决这个问题,并且希望我已经正确地解释了这个问题。
提前致谢!
答案1
有可能的http://ipinfo.io/ip有时会失败并且不返回任何内容。无论如何,在将 $currextip 值传递给 sed 之前,您至少应该对其进行最低限度的检查。
添加这样的内容就足够了:
if [ -z $currextip ]; then
echo "Something went wrong with ipinfo.io!"
exit
fi
我不知道这是否真的是导致您出现问题的原因,但您应该始终检查故障情况。
附注:在这种情况下,您不应该在 sed 中使用“:”分隔符,因为如果您在某个时候获得 IPv6,事情可能会变得非常错误。