Почему исполняемый файл не может найти общую библиотеку только при запуске в качестве http-запроса - PullRequest
0 голосов
/ 01 апреля 2019

У меня есть php-файл с вызовом shell_exec.Функции shell_exec запускают файл .sh.

#!/bin/bash

filename=$(ls *.jpg -Art | tail -n 1)
codegen_dir=/usr/local/codegen/

cd "$codegen_dir"
out=$(./classifier /var/www/$filename)
echo $out

Исполняемый файл-классификатор существует в codegen_dir и имеет 1 зависимость от общей библиотеки.Скрипт корректно запускается из командной строки.Файл php также правильно запускается из командной строки.однако, когда я запускаю php-файл как запрос http, в std_err я получаю следующее:

"./ classifier: ошибка при загрузке общих библиотек: libreader.so: не удается открыть файл общего объекта: такого файла нет иликаталог "

.so файл находится в том же каталоге, что и исполняемый файл

Мой корень php-сервера: / var / www

  • Все файлы на сервереroot имеет разрешения: -rwxrwxrwx 1 www-data www-data
  • Все файлы в 'codegen_dir' имеют разрешения: -rwxrwxrwx 1 ubuntu www-data
  • Я могу читать другие файлыв codegen_dir

1 Ответ

0 голосов
/ 01 апреля 2019

Общий путь к библиотеке может быть недоступен пользователю apache. Вы можете разрешить программу классификатора в файле sudoers для apache и использовать sudo для запуска приложения классификатора как пользователь apache

Или сделать общий библиотека и ее путь доступными для всех пользователей, изменив разрешение

out=$(sudo ./classifier /var/www/$filename)

Попробуйте войти в систему с помощью пользователя Apache и запустить скрипт выше или попытаться получить доступ к общедоступной библиотеке

su -s /bin/bash apache
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...