【问题标题】:nsupdate returns error but is successfullnsupdate 返回错误但成功
【发布时间】:2015-08-10 10:19:43
【问题描述】:

我在 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 = random valid IPv4 IP):

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

$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 这里是为 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) "" } 

【问题讨论】:

    标签: php bind9


    【解决方案1】:

    我有同样的“问题”困扰了我一段时间。 当我在命令行上尝试上述 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";

    【讨论】:

    • 我已经用 quit 进行了测试,但我仍然得到 $ret = 2
    • 问题是关于$ret=1。退出代码 2 是关于其他一些错误。尝试手动更新记录和/或检查您的日志文件。可能格式或访问权限不正确。
    【解决方案2】:

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

    【讨论】:

    • $cmdout 只是一个空数组,$ret 是 int(1)(请参阅更新 1 了解启用调试的 $cmdout)
    • 可能错误与更新操作本身无关,而是由于“本地”问题(写入本地文件,如日志、锁或状态)。检查用户/权限或尝试以 root 身份运行它。此外,附加 strace 或 gdb 可能很有用。
    猜你喜欢
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    相关资源
    最近更新 更多