Помогите отладить мой bash скрипт

Я написал скрипт (мой первый), который нацелен на замену IP-адреса в файле конфигурации bind всякий раз, когда он обнаруживает, что 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 в какой-то момент, все может стать действительно неправильным.

Другие вопросы по тегам