Я запускаю Bind и Apache на Debian, и я делаю динамические обновления в одной из моих зон с помощью nsupdate через скрипт php
Функция обновления:
function nsupdate($subdomain, $ip) {
$domain = escapeshellcmd($subdomain . '.example.com');
$ip = escapeshellcmd($ip);
$data = "<<EOF
server localhost
zone example.com
update delete $domain A
update add $domain 10 A $ip
send
EOF";
exec("/usr/bin/nsupdate -k /var/bind/keys/Kexample.com.+157+40387.private $data", $cmdout, $ret);
return $ret;
}
Я называю эту функцию (sub = ‘test’, ip = random valid IPv4 IP):
$ret = nsupdate($sub, $ip);
if ($ret != 0) {
$msg = "Error! Code: $ret";
}else {
$msg = "Success!";
}
Значение $ ret равно «1», а $ msg — «Ошибка! Код: 1 ‘, но системный журнал показывает
client ::1#9726/key example.com: signer "example.com" approved
client ::1#9726/key example.com: updating zone 'example.com/IN': deleting rrset at 'test.example.com' A
client ::1#9726/key example.com: updating zone 'example.com/IN': adding an RR at 'test.example.com' A
я могу пропинговать поддомен, и он возвращает новый IP. Но я все еще хотел бы знать, почему при успешном обновлении вызов nsupdate возвращает 1, а не ожидаемый 0.
обновление 1
здесь $ cmdout с включенной отладкой для nsupdate
array(13) {
[0]=> string(22) "Outgoing update query:"[1]=> string(59) ";; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id: 58402"[2]=> string(55) ";; flags:; ZONE: 1, PREREQ: 0, UPDATE: 2, ADDITIONAL: 1"[3]=> string(16) ";; ZONE SECTION:"[4]=> string(22) ";example.com. IN SOA"[5]=> string(0) ""[6]=> string(18) ";; UPDATE SECTION:"[7]=> string(33) "test.example.com. 0 ANY A"[8]=> string(45) "test.example.com. 10 IN A 22.22.22.22"[9]=> string(0) ""[10]=> string(22) ";; TSIG PSEUDOSECTION:"[11]=> string(109) "example.com. 0 ANY TSIG hmac-md5.sig-alg.reg.int. 1439217988 300 16 kaHm1/GbMf0+cuIJO62lgw== 58402 NOERROR 0"[12]=> string(0) "" }
Попробуйте добавить var_dump($cmdout);var_dump($ret);
до return $ret
, $ msg не имеет значения.
У меня была та же самая «проблема», которая беспокоила меня некоторое время.
Когда я попробовал вышеупомянутые команды nsupdate в командной строке, все было в порядке и состояние выхода (введите в консоли сразу после nsupdate -> echo $?
вернул 0) но позвонил с php это был 1.
Пока я не понял, что, находясь на консоли, я набрал quit
чтобы закончить мою сессию nsupdate. Как только я добавил эту строку в скрипт php, все было нормально, иначе код выхода 0.
Так что меняй $data
в
$data = "<<EOF
server localhost
zone example.com
update delete $domain A
update add $domain 10 A $ip
send
quit
EOF";