shell_exec () всегда возвращает пустую строку - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь создать сервер в своем телефоне Android.Я не могу выполнить какой-либо скрипт оболочки из своего PHP-кода.

Вот код:

//index.php
<?php
$output=shell_exec("sdcard/htdocs/myscript.sh 2>&1");
if(!$output){
  echo "Failed";
}else{
  echo $output;
}
?>

//myscript.sh
cd sdcard/htdocs/images
ls -t1 | head -n 1

Скрипт отлично работает в эмуляторе терминала.Я также попытался изменить разрешения файла сценария, но это не сработало.Я не знаю, требуются ли ему права суперпользователя для выполнения сценариев оболочки в коде PHP.

Весь код используется для возврата имени файла последнего файла, созданного в каталоге изображений.

Нужнопредложения по созданию этого кода. Есть ли другой способ выполнить требуемую работу?

Ответы [ 3 ]

0 голосов
/ 09 июня 2018

Убедитесь, что вы запустили

chmod a+x sdcard/htdocs/myscript.sh

в вашем файле.

Кроме того, $ output не является логическим значением.

0 голосов
/ 13 марта 2019

sdcard и sdcard / htdocs требуют исполняемых прав доступа.Для sdcard / htdocs / images требуются права на выполнение и чтение (ls в myscript.sh), как и для sdcard / htdocs / myscript.sh.Но я предполагаю, что это что-то еще, потому что должны отображаться ошибки прав доступа (2> & 1).

Возможно FAT!

0 голосов
/ 08 июня 2018

Ваш код выглядит нормально.Разрешение суперпользователя не требуется для выполнения скрипта.Вы должны включить вывод ошибок PHP или проверить файл журнала ошибок PHP.Могу поспорить, вы найдете причину там.Если нет, перепроверьте каталог и права доступа к файлам:

./index.php
./sdcard/htdocs/myscript.sh
./sdcard/htdocs/images

sdcard и sdcard/htdocs требуют наличия исполняемых прав доступа.sdcard/htdocs/images требует разрешения на выполнение и чтение (ls в myscript.sh), как и sdcard/htdocs/myscript.sh.Но я предполагаю, что это что-то еще, потому что ошибки разрешения должны отображаться (2>&1).


Редактировать

Вы можете найти последний измененный файл с PHP,нет необходимости запускать другой процесс.Возьмите одно из этих двух:

$images = glob('sdcard/htdocs/images/*');
$images = array_combine(array_map('filemtime', $images), $images);
asort($images);
echo $lastModifiedImage = end($images);

Или с меньшим количеством операций с массивами:

$images = glob('sdcard/htdocs/images/*');
array_reduce($images, function($previous, $element) use (&$found) {
    $mtime = filemtime($element);
    $found = $previous < $mtime ? $found : $element;
    return $previous < $mtime ? $mtime : $previous;
}, 0);
echo $found;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...