Помогите отладить мой 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 в какой-то момент, все может стать действительно неправильным.