У меня проблема с моим PHP-скриптом.
<?php
error_reporting(-1);
ini_set('display_errors', 1);
$output = "";
$befehl = exec('./start.sh', $output);
var_dump($output);
?>
Это мой скрипт:
#!/bin/sh
echo "Hallo Europa"echo "Hallo Osterhase..."cd /home/support/projects/big/
bash start.sh
pwd
whoami
Это работает в оболочке с ‘php run.php’
Но не с Http: //ip/run.php
Apache работает как мой домашний пользователь «Макс». Сервер недоступен для общего доступа, поэтому он не представляет угрозы для безопасности.
Вывод в Firefox:
array(4) { [0]=> string(12) "Hallo Europa" [1]=> string(18) "Hallo Osterhase..." [2]=> string(31) "/home/support/projects/big" [3]=> string(7) "support" }
Но это должно начать мою особенность огурца.
Спасибо за помощь.
Сначала убедитесь, что у вас есть разрешение на выполнение сценария .sh:
chmod +x /your/full/path/to/start.sh
После этого попробуйте:
exec("(/your/full/path/to/start.sh) 2>&1", $output, $result);
if($result != 0){
//if $result is different to 0 -> something wrong and display errors
print_r([$output,$result]);
}else{
//if $result == 0 -> Should be OK and continue with your code here
print_r([$output,$result]);
}
Маленькое объяснение о 2>&1
от: https://unix.stackexchange.com/a/99264
2
ссылается на второй файловый дескриптор процесса, то есть на stderr.
>
означает перенаправление.
&1
означает, что цель перенаправления должна быть в том же месте, что и первый дескриптор файла, то есть stdout.
Двойное цитирование важно.
С помощью system
лучше всего в этом случае, так как он содержит полный вывод stdout в $output
,
&
говорит оболочке выполнить команду в фоновом подпроцессе.
Это означает, что следующая строка скрипта будет выполнена напрямую.
$output
переменная обновляется в фоновом режиме, поэтому выходные данные могут отличаться в зависимости от времени.
<?php
$output = system("./start.sh &");
var_dump($output);
Во многих случаях полезно использовать паузы:
<?php
$output = system("./start.sh &");
sleep(1);
var_dump($output);
Скорее всего, вам нужно обновить файл php.ini, чтобы exec()
Откройте файл php.ini и найдите строку с disable_functions
и удалить exec
из списка отключенных функций. Сохраните, перезапустите веб-сервер и попробуйте снова.