我在Debian上运行Bind和Apache,我正在通过php脚本nsupdate对我的一个区域进行动态更新
更新功能:
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 =随机有效的IPv4 ip):
$ret = nsupdate($sub, $ip);
if ($ret != 0) {
$msg = "Error! Code: $ret";
}else {
$msg = "Success!";
}
$ret的值是'1',$msg的值是'Error!代码:1',但是syslog显示
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
i可以ping子域并返回新的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) "" }
我有同样的"问题"困扰我一段时间了。当我在命令行上尝试上述nsupdate命令时,一切都很好,退出状态(在nsupdate -> echo $?
返回0后直接在控制台输入),但从php调用它是1。
直到我意识到,当我在控制台上我输入quit
结束我的非更新会话。当我将这一行添加到php脚本中时,一切都很好,也就是退出代码0。
将$data
改为
$data = "<<EOF
server localhost
zone example.com
update delete $domain A
update add $domain 10 A $ip
send
quit
EOF";
尝试在return $ret
之前添加var_dump($cmdout);var_dump($ret);
。