2016-03-22 5 views
0

Итак, у меня есть этот PHP-скрипт, который вызывает REST API с curl. URL в основном выглядит следующим образом:Curl в PHP vs Curl Command Line

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 

ответ возвращается как успех, но изменение не на самом деле сделаны в брандмауэре, который кажется странным. Если я возьму и запустил этот же 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 скрипт возвращает тот же ответ, как скручивание, в командной строке, но результат не то же самое. Есть ли какой-то заголовок, который я не передаю, или что-то, что я должен сделать, чтобы это нормально работало? Я также должен добавить, что он работает, если я беру URL-адрес и вставляю его в браузер, и если я передам команду shell_exec. Спасибо за помощь!

Ответ завитка командной строки:

* Connection #0 to host firewall1 left intact 
<response status="success" code="20"><msg>command succeeded</msg></response> 

Ответ завиток в PHP скрипт:

<response status="success" code="20"><msg>command succeeded</msg></response> 

ответ

0

Похоже, вы пропускаете возможность -g в PHP вызова. Как я могу увидеть ниже описания от руководства:

«Когда этот стиль используется, опция -g должна быть предоставлена, чтобы остановить ротор от интерпретации квадратных скобок, как специальные символов подстановки Link местной и локальные адреса сайта, включая а. Идентификатор области, такой как fe80 :: 1234% 1, также может быть использован, но область области должна быть числовой или соответствовать существующему сетевому интерфейсу в Linux, а символ процента должен быть экранирован URL. Предыдущий пример в URL-адрес SFTP может выглядеть как :sftp://[fe80::1234%251]/ "

https://curl.haxx.se/docs/manual.html

Лучшим вариантом будет вызов общей строки URL с использованием функции выполнения сценария оболочки PHP shell_exec() в вашем случае. PHP curl - это библиотека обертки, которая будет использоваться для завивки с использованием PHP, может быть несколько вариантов, которые PHP curl library может не поддерживать, например, -g в вашем случае, который доступен в командной строке.

+0

Got it. Да, он отлично работает с shell_exec, поэтому я думаю, что я буду придерживаться этого. Спасибо за ответ! – CluelessJSMan