Php nsupdate返回错误,但已成功

Php nsupdate返回错误,但已成功,php,bind9,Php,Bind9,我在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

我在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;
}
$ret的值为'1',$msg的值为'Error!代码: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
我可以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) "" } 
数组(13){
[0]=>字符串(22)“传出更新查询:”
[1] =>string(59);->>HEADER尝试在
返回$ret之前添加
var_dump($cmdout);var_dump($ret);
与$msg无关。

我也有同样的“问题”困扰了我一段时间。 当我在命令行上尝试上面的nsupdate命令时,一切正常,退出状态(在nsupdate->
echo$?
之后直接键入console返回0),但从php调用的是1

直到我意识到在控制台上时,我键入了
quit
来结束我的nsupdate会话。当我将这一行添加到php脚本中时,一切都很好,即退出代码0

因此将
$data
更改为


$data=“$cmdout只是一个空数组,$ret是int(1)(有关启用调试的$cmdout,请参阅更新1)此错误可能与更新操作本身无关,而是由于“本地”问题(写入本地文件,如日志、锁或状态)。请检查用户/权限或尝试以root用户身份运行。此外,附加strace或gdb可能会有用。我已使用quit进行了测试,但仍然得到$ret=2问题是关于$ret=1。退出代码2是关于其他错误。请尝试手动更新记录和/或检查日志文件。可能格式或访问权限不正确。
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) "" }