【发布时间】:2019-04-01 02:14:27
【问题描述】:
我有一个带有 shell_exec 调用的 php 文件。 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
- 服务器根目录下的所有文件都有权限:-rwxrwxrwx 1 www-data www-data
- “codegen_dir”中的所有文件都具有以下权限:-rwxrwxrwx 1 ubuntu www-data
- 我可以读取 codegen_dir 中的其他文件
【问题讨论】:
-
我们可以有
./classifier和httpd.conf的代码吗? -
我没有对 httpd.conf 进行任何更改,也无法共享可执行文件的代码。但是,我可以澄清我的问题:它是一个可执行文件,只有一个共享库依赖项(.so 文件),如果有帮助的话
-
加载程序从不检查当前目录中的共享对象,除非它通过 $LD_LIBRARY_PATH 明确指向。有关更多详细信息,请参见 ld.so(8) 手册页。您可以将共享库放在标准位置之一,请参阅 /etc/ld.so.conf。示例:/usr/local/lib/libreader.so
-
重申:我能够在命令行上运行脚本,问题是当我从 http 请求触发它时。是的,我确实设置了 ld.so.conf