我有一个设计工具扩展,用于我正在处理的网站上。设计工具使用inkscape命令行导出图像。有一个php接口可以使用最终调用shell_exec($inkscapeCmd)的命令行操作。在注意到图像文件没有被导出之后,我创建了一些测试来尝试和调试。我将执行行更改为shell_exec($inkscapeCmd . ' 2>&1')以查看错误消息:
sh: inkscape: command not found
...这是奇怪的,因为它肯定安装和访问。我在测试页面上添加了对用户的检查,以确保有权访问inkscape的用户执行命令:
$processUser = posix_getpwuid(posix_geteuid());
echo 'user: ' . $processUser['name'];
然后我ssh进入服务器以确认我可以运行与该用户相同的命令,并且能够运行它们而没有任何问题(这也确认了inkscape在PATH中)。我可以从PHP运行其他基本shell命令而不会出现问题,如下所示:
echo shell_exec('ls');
但现在我不知所措;我不知道还有什么可以检查以确定为什么我收到'命令未找到'错误。任何方向都会有所帮助。
服务器(相当陈旧,我知道):
CentOS 6.7
PHP 5.3.3
Inkscape v0.47
为什么这会被贬低? 我以为我问了一个合理的问题,我最终得到了我想要的答案; 设计工具需要可执行文件的路径(它在配置文件中定义不正确)。
该进程在其路径中没有inkscape的位置。
您必须提供可执行文件的完整路径。
例
在/ usr/ bin中/ Inkscape中
在命令行中键入'whereis inkscape'来查找位置。
这样做了。您是否有机会解释为什么在这种情况下该过程需要完整路径?它不使用进程用户的路径吗?
您登录的用户与运行Web服务器的用户不同。在命令行上执行'echo $ PATH'。这将显示您的路径。您可以运行可执行文件而无需指定完整的程序路径。 Web服务器在更多可能的情况下运行的用户被条带化到最低限度。这就是为什么如果你看一下很多基于网络的软件,你需要填写某些系统软件的路径。
以前,当我从命令行测试时,我确实以Web服务器用户身份登录。当Web服务器是启动器时,是否存在某种已修改的设置/路径?不确定这是否是提出问题的正确方法?
你将不得不进入CentOS的深处并假设apache。要了解发生了什么。我确信有很多事情可以保护网络服务器。我自己就是想在配置文件中填写完整路径。一方面的好处是你需要拥有主要发行版上不同版本的内容,你可以将它放在一个不同的位置供你访问。