【问题标题】:Can't find a Perl script from PHP/Apache无法从 PHP/Apache 中找到 Perl 脚本
【发布时间】:2015-11-18 09:52:44
【问题描述】:

我想从 PHP 脚本运行 Perl 脚本。我可以从终端(作为 root 用户)很好地做到这一点,但是从我的应用程序(www-data 用户)运行时我不能。

在本地主机上开发应用程序时,我也能做到这一点,但是当我切换到另一台服务器时,问题就出现了。

我的网页使用 AJAX POST 请求调用 PHP 脚本,这适用于我的其他不调用 Perl 的 PHP 脚本。

我在我的 PHP 脚本中尝试了以下命令,但没有成功:

system("/filepath/file.pl");
exec("/filepath/file.pl");
passthru("/filepath/file.pl");

托管我的应用程序的服务器上的 Apache 日志显示以下错误:

sh: /file.pl: not found

通过在我的服务器上运行以下代码,我看到网络用户被视为 www-data:

ps aux | grep apache

为了测试,我还设置了我的应用程序使用的所有文件和目录的权限,以允许任何用户使用 chmod 777 进行任何类型的访问。

请注意:我的应用程序只对某些用户可用(我使用 .htaccess 文件来设置这些权限并要求用户登录)所以如果有办法改变服务器如何看待这个用户(来自 www-数据,登录用户的凭据)那么也许这会有所帮助 - 我该怎么做?

【问题讨论】:

  • /filepath 将启动驱动器文件系统的根目录,例如c:\。如果/filepath 是您网站的根目录,那将无法正常工作。你需要包含整个路径:/home/user/sites/example.com/public_html/filepath/file.pl- type thing
  • 'not found' 真的表示权限问题吗?

标签: php apache perl system passthru


【解决方案1】:

试试这样的

exec("/usr/bin/perl /full-path/script.pl",$output);

【讨论】:

  • 为什么 OP 应该“试试这个”?一个好的答案总是会解释所做的事情以及这样做的原因,不仅适用于 OP,而且适用于 SO 的未来访问者。
【解决方案2】:

感谢所有建议!最后,这是托管我的应用程序的服务器上 Apache 目录中的 php.ini 文件中的安全设置问题:

/etc/php5/apache2/php.ini

安全模式设置为“开启”,这会阻止 php 文件访问/执行任何本地文件。 (尝试访问另一个非脚本文件时,PHP 脚本也失败了:other.html)。

为了在不删除服务器上所有应用程序的安全模式设置的情况下解决此问题,我将上述 php.ini 文件更改为包含以下内容:

safe_mode: on
safe_mode_include_dir: /filepath
safe_mode_exec_dir: /filepath

可以在此处找到有关这些配置变量的更多信息: http://php.net/manual/en/ini.sect.safe-mode.php

【讨论】:

    猜你喜欢
    • 2012-02-18
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-14
    相关资源
    最近更新 更多