2013-02-25 3 views
3

У меня есть сценарий deploy.sh оболочки, которая имеет следующее содержание: -Выполнение сценария оболочки с помощью PHP

echo "0 Importing the code" 
eval "git pull -u origin master" 

echo "1 Backing up existing data in database.." 
// -- other code follows here 

Когда я выполнить скрипт непосредственно с помощью терминала, я получаю следующий результат: -

 
0 Importing the code 
 
remote: Counting objects: 5, done. 
remote: Compressing objects: 100% (2/2), done. 
remote: Total 3 (delta 1), reused 0 (delta 0) 
Unpacking objects: 100% (3/3), done. 
From bitbucket.org:user/repo 
* branch   master  -> FETCH_HEAD 
Updating db13xxx..6705xxx 
 
1 Backing up existing data in database.. 

Это правильно. Тем не менее, я написал скрипт PHP, с помощью которого я могу активировать скрипт deploy.sh по http. Содержание этой страницы PHP выглядит следующим образом: -

$output = `./deploy.sh`; 
echo '<pre>', $output, '</pre>'; 

Когда я вызываю этот PHP файл через браузер, сценарий оболочки на самом деле получения вызова, и я получаю следующий результат: -

 
0 Importing the code 
1 Backing up existing data in database.. 

Проблема заключается в том, что команда eval "git pull -u origin master" не была выполнена и ее вывод не показан. Любая идея, в чем проблема?

+0

ли 'eval' необходимо? Не могли бы вы просто запустить 'echo '0'; git pull -u origin master'; echo '1'' и т. д. – Armand

+0

@Alison, после того как я сказал, я попытался удалить eval.Он по-прежнему запускается при непосредственном вызове, но тот же результат при прохождении через php-страницу. – Sparky

+1

Вы пытались добавить '#!/Bin/bash' в начало скрипта? – Armand

ответ

3

Вы должны попытаться избежать выполнения команд оболочки в php.

Сказав это, попробуйте следующее:

$output = shell_exec('./deploy.sh'); 
echo "<pre>".$output."</pre>"; 

По: http://www.php.net/manual/en/function.shell-exec.php

+0

спасибо за ответ, но это не сработало. – Sparky

+0

Обновлен код, появляется ли сообщение об ошибке при попытке запустить php-скрипт на данный момент? – ChrisK

+0

nope, а не сообщение об ошибке (я пробовал с обновленным кодом ur) – Sparky

3

Одна вещь, которую вы можете сделать с помощью функции exec() должен пройти два дополнительных значения для большего понимания.

Вот код, который я использую для проверки сценариев оболочки из веб-интерфейса.

<?php 
require_once(__DIR__.'/../libs/Render.php'); 
error_reporting(E_ALL); 


//Initialize and Run Command, with a little trick to avoid certain issues 
$target='cd ../../your/relative/path && ./CustomScript.sh'; 
$outbuf=exec($target,$stdoutbuf, $returnbuf); 


//Structure 
$htm=       new renderable('html'); 
$html->children[]= $head=  new renderable('head'); 
$html->children[]= $body=  new renderable('body'); 
$body->children[]= $out=  new renderable('div'); 
$body->children[]= $stdout= new renderable('div'); 
$body->children[]= $returnout= new renderable('div'); 


//Value 
$out->content=   'OUTPUT: '.$outbuf; 
$stdout->content=  'STDOUT: '.var_export($stdoutbuf,true); 
$returnout->content= 'RETURN: '.$returnbuf; //127 == Pathing problem 


//Output 
print_r($html->render()); 
?> 

Файл использует renderable class из проекта я использую это, но вы можете поместить в выходную строку, где вы используете его или echo/print_r() точно так же. Также убедитесь, что вы не находитесь в безопасном режиме, запустив phpinfo(); много людей, имеющих эту проблему.

Кроме того, нет причин, по которым вы должны избегать использования сценариев оболочки в PHP. PHP, являющийся языком сценариев, довольно экономен при объединении многих сценариев оболочки, позволяющих администрировать более высокого уровня.

PHP предназначен не только для «веб-сайтов». Даже тогда раскрытие административных сценариев для веб-интерфейсов само по себе весьма полезно; иногда это даже требование к проекту.

3

Это работает

<?php 
$output = shell_exec('sh deploy.sh'); 
echo "$output"; 
?> 

Перед этим убедитесь, что файл имеет CHMOD 777 разрешения.

-1

Это правильный код

<?php 
    $cmd = 'ifconfig'; // pass command here 
    echo "<pre>".shell_exec($cmd)."</pre>"; 
?> 
+0

Это не отвечает на вопрос. Вопрос (3-летний) касался конкретной пакетной работы, которая выполнялась, но только частично. Речь идет не о 'ipconfig'. – trincot

Смежные вопросы