nsupdate返回错误但是成功

时间:2015-08-10 10:19:44

标签: php bind9

我在Debian上运行Bind和Apache,并使用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 =&#39; test&#39;,ip =随机有效的IPv4 IP):

$ret = nsupdate($sub, $ip);
if ($ret != 0) {
    $msg = "Error! Code: $ret";
}else {
     $msg = "Success!";
}

$ ret的值是&#39; 1&#39;并且$ msg是“错误!代码:1&#39;,但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

我可以ping子域并返回新的IP。但我仍然想知道为什么nsupdate调用返回1而不是成功更新时的预期0。

更新1 这里为nsupdate启用了调试的$ cmdout

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) "" } 

2 个答案:

答案 0 :(得分:1)

尝试在var_dump($cmdout);var_dump($ret);之前添加return $ret。 $ msg无关紧要。

答案 1 :(得分:1)

我有同样的问题&#34;困扰我一段时间了。 当我在命令行上尝试上面的nsupdate命令时一切都很好并且退出状态(在nsupdate后直接输入控制台 - &gt; 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";