2013-12-11 3 views
2

У меня есть php-файл, размещенный на сервере apache в Ubuntu. Все работает отлично, кроме shell_exec('myscript.sh').shell_exec не работает с .sh скриптами

Если я выполняю что-либо вроде shell_exec('dir'), shell_exec('ls') и т. Д., Он отлично работает. Но только когда я выполняю простой скрипт оболочки через shell_exec, он не работает.

Для простоты я поставил команду echo в сценарий оболочки. Тот же скрипт работает, когда я выполняю через терминал. Как:

# sh myscript.sh // works perfectly fine 

Но не из PHP, ниже мой PHP код

<?php  
$result = shell_exec('myscript.sh');  
echo $result;  
?> 

Примечания:

  • Безопасный режим выключен
  • shell_exec не существует в списке disable_functions
  • Оба файла php и .sh находятся в одной папке

Благодаря

+0

.sh файл помечен как исполняемый файл и у пользователя веб-сервера есть разрешения на выполнение? Вы используете './Script.sh'? – AbraCadaver

+0

, так что мне теперь делать? любые предложения – jazean

+1

Попробуйте сделать свой 'shell_exec' * точно * таким же, как при попытке вашего терминала:' shell_exec ('sh myscript.sh') '. –

ответ

2

Попробуйте дать PHP владельца файла.

chown phpusername:phpusername myscript.sh или то же самое для пользователя apache.

Если это не помогает, попробуйте chmod 777 myscript.sh, но это, как правило, очень плохая идея.

+1

Где 'phpusername' * возможно *' www-data'. –

+0

nope, не работает даже после предоставления разрешений – jazean

+0

@jazean: Вы пытались 'shell_exec ('sh myscript.sh')'? Возможно, вам сначала понадобится выполнить его выполнение: 'chmod + x myscript.sh'. –

0

Я думаю, что ти должно быть

$result = shell_exec('./myscript.sh'); 
+0

не работает даже с объявлением этого типа – jazean

+0

@jazean убедитесь, что файл выполним для всех пользователей chmod a + x myscript.sh или вставьте ошибку, которую вы получаете в форме выполнения скрипта php , – StormRideR

+0

i m не получает ошибку, но скрипт внутри нее не выполняет – jazean

0

Это потому, что вам нужно бежать команду в качестве аргумента Баш. И для этого вам нужно использовать двойные кавычки, завершающие внутри вашей команды, и, наконец, используйте 2> & 1 как закрывающий кусок вместе с вашей желаемой командой функции скрипта.

т.е.

$xarg = escapeshellarg("./myscript.sh 2>&1"); 
    $result = shell_exec("$xarg"); 

и держать в уме, взаимодействие между PHP и Баш является уникальным. PHP всегда зависает, ожидая на bash. Несмотря на то, что если этот сценарий запущен, ваш php должен ожидать перехода к следующей строке в скрипте, не дожидаясь bash после вызова функции.

+0

нет, даже это не работает – jazean

+0

О да ... и на вашем скрипте bash вам нужно определить $ xarg как фактическое значение. Пустой аргумент, такой как ваш скрипт, запускающий команду самостоятельно, всегда равен 1 доллару. Следовательно, вы хотели бы идентифицировать внутри своего bash следующим образом: $ xarg = $ 1. Это устанавливает связь между обоими сценариями до того, как bash может согласиться продолжить. – Faron

+0

Извините, я не понял, должен ли я что-нибудь изменить в файле myscrip.sh? Потому что я пытался выше, и он не работает – jazean

0

Хорошо, я получил решение. Проблема заключалась в файл PHP и .sh файл должен быть в той же группе пользователей и всех других файлов, которые в настоящее время доступ к РНР и .sh файл должен быть также в той же группе

так,

addgroup myGroupName toOtherGroupName

Спасибо за вашу помощь

0

Я просто использовать

$res = passthru($cmd); 

и все работает. Это мой код, который может иметь разные результаты.

function flv_convert($in,$out_vid) 
{$cmd ='/usr/bin/avconv -i '.$in.' -c:v libx264 -preset ultrafast -b:v 230k -bufsize 64k -s 640x360 -an '.$out_vid.' 2>&1 1> /dev/null'; 
$res = passthru($cmd);  } 
$in = $_POST['url']; 
$out_vid = reset(explode('.',$in)).'O.mp4' ; 
if ( flv_convert($in, $out_vid) ) 
echo 'done ';else echo ' <p>Fail</p> ' 
Смежные вопросы