帮助调试我的 bsh 脚本

帮助调试我的 bsh 脚本

我编写了一个脚本(我的第一个脚本),目的是当检测到文件中出现的 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,事情可能会变得非常错误。

相关内容