Экземпляр Web PHP не будет запускаться, несмотря на правильность разрешений

1

Возможно, вы могли бы помочь мне с довольно неприятной проблемой. Я не смог скомпилировать исполняемый файл, позвонил ему $$execprob, на хост Linux, который я тестировал, поэтому скомпилировал его на другом хосте и переместил исполняемый файл. Он отлично работает с моим SSH-пользователем, но когда веб-сервер использует

exec( "/home/$$username/usr/local/bin/$$execprob", $output, $return );

Я не получаю $output а $return - 127, или файл не найден.

Вот список информации из моего тестирования, который может помочь:

  • Файл работает нормально в обычном режиме SSH.
  • Разрешениями через SSH являются -rwxr-xr-x.
  • Выполнение exec( 'ls -l' ) поскольку веб-сервер показывает, что файл существует с теми же правами, что и SSH
  • в SSH: ${USER} является владельцем файла $$ username
  • в PHP: ${USER} ничего не возвращает
  • Запуск exec( 'if [-x/home/$$username/usr/local/bin/$$execprob]; then echo "thing";fi' ) печатает "вещь";
  • В SSH запущен php -a и php -a exec( "/home/$username/usr/local/bin/$$execprob", $output, $return ); запускает $$ execprob правильно, с $output показывающим вывод, и $return == 0.
  • У меня есть строка в моем.bashrc, которая правильно загружает $LD_LIBRARY_PATH: export LD_LIBRARY_PATH=$HOME/usr/local/lib:$LD_LIBRARY_PATH; Это необходимо для запуска исполняемого файла, поскольку он использует динамическую библиотеку. Мой.bashrc не запускается веб-сервером; однако, работает:

exec( "export LD_LIBRARY_PATH=$HOME/usr/local/lib:$LD_LIBRARY_PATH;/home/$$username/usr/local/bin/$$execprob", $output, $return );

по-прежнему имеет тот же неудачный результат.

Если что-то еще я могу сделать, чтобы собрать дополнительную информацию об устранении неполадок, пожалуйста, дайте мне знать.

Благодарю!

  • 1
    В вашем PHP-скрипте попробуйте print "/home/$$username/usr/local/bin/$$execprob" чтобы убедиться, что он правильно разрешает любые имена переменных и т. Д.
  • 0
    Спасибо, @JoelC, за размышления о проблеме. На самом деле я вообще не использую имена переменных. Я просто использовал эти заполнители для представления моего имени пользователя и имени исполняемого файла. то есть. Я просто запускаю /home/jonnybajonny/usr/local/bin/execfilename и это не работает.
Показать ещё 3 комментария
Теги:
ssh

1 ответ

0
Лучший ответ

Проблема была, наконец, прослежена до того, что переменная среды $ LD_LIBRARY_PATH не была правильно настроена. У меня была эта строка:

exec( "export LD_LIBRARY_PATH=$HOME/usr/local/lib:$LD_LIBRARY_PATH;
    /home/$$username/usr/local/bin/$$execprob", $output, $return );

Однако, конечно, (как уже упоминалось в @JoelC выше) переменная $HOME в команде export будет разрешать $HOME пользователя PHP. Это было исправлено с использованием абсолютного пути как такового:

exec( "export LD_LIBRARY_PATH=/home/$$username/usr/local/lib:$LD_LIBRARY_PATH;
    /home/$$username/usr/local/bin/$$execprob", $output, $return );

Стоит отметить, что не было абсолютно никакого результата, возвращенного, чтобы помочь диагностировать это, что странно. Когда я запускаю $$execprob из оболочки без набора $LD_LIBRARY_PATH он возвращает ошибку об отсутствующем файле.so. Почему бы эту же ошибку не вернуть в качестве вывода здесь? Может быть, есть другая категория вывода для системных сообщений, а не фактический вывод команды? Интересно, есть ли способ вернуть эти типы сообщений в область exec().

Но я полагаю, что вопрос для другого поста...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню