所以,我已经有了这个用curl调用REST API的PHP脚本。 URL基本上如下所示:
https://firewall1/api/?type=config&action=set&xpath=/config/devices/entry[@name='localhost.localdomain']/vsys/entry[@name='vsys1']/rulebase/security/rules/entry[@name='RULENAME']&element=<disabled>no</disabled>&key=APIKEY
响应成功回归,但实际上并未在防火墙中进行更改,这看起来很奇怪。如果我使用命令行curl运行和运行相同的URL,它将按预期工作。
curl -v -k -g "https://firewall1/api/?type=config&action=set&xpath=/config/devices/entry[@name='localhost.localdomain']/vsys/entry[@name='vsys1']/rulebase/security/rules/entry[@name='RuleName']&element=<disabled>no</disabled>&key=APIKEY"
我的卷曲设置如下所示:
$failover1 = curl_init($enableFailover1);
$failback1 = curl_init($disableFailover1);
$commit1 = curl_init($commitFW1);
//set curl options
curl_setopt_array($failover1, array(
CURLOPT_SSL_VERIFYHOST => 0,
CURLOPT_SSL_VERIFYPEER => 0,
CURLOPT_POST => TRUE,
CURLOPT_RETURNTRANSFER => TRUE
));
$responseFail1 = curl_exec($failover1);
$responseBack1 = curl_exec($failback1);
$responseCommit1 = curl_exec($commit1);
//failover and take approprate action for errors
if($responseFail1 === FALSE) {
die(curl_error($failover1));
} else {
//do some stuff
}
运行PHP脚本会返回与curl命令行相同的响应,但结果不一样。是否有一些标题我没有通过或者我应该做些什么才能让它正常工作?我还应该补充说,如果我在浏览器中使用URL并粘贴并且将命令传递给shell_exec,则它可以工作。谢谢你的帮助!
来自curl命令行的响应:
* Connection #0 to host firewall1 left intact
<response status="success" code="20"><msg>command succeeded</msg></response>
PHP脚本中curl的响应:
<response status="success" code="20"><msg>command succeeded</msg></response>
答案 0 :(得分:0)
看起来你在PHP调用中省略了-g
选项。我可以在下面的手册中看到描述:
“当使用这种样式时,必须给出-g选项以阻止curl将方括号解释为特殊的globbing字符。链接本地和站点本地地址,包括作用域标识符,例如fe80 :: 1234%1,也可以使用,但范围部分必须是数字或与Linux上的现有网络接口匹配,百分比字符必须是URL转义.SFTP URL中的前一个示例可能看起来像
:sftp://[fe80::1234%251]/
“
https://curl.haxx.se/docs/manual.html
更好的选择是在您的情况下使用PHP shell脚本执行函数shell_exec()
调用整个URL字符串。 PHP curl是一个用于使用PHP进行curl的包装库,在你的情况下可能没有像你自己的-g
选项那样支持PHP curl库的选项。