【问题标题】:shell_exec() and exec() not working in PHPshell_exec() 和 exec() 在 PHP 中不起作用
【发布时间】:2012-06-17 14:22:36
【问题描述】:

像许多其他人一样,我对 PHP 中的 shell_exec() 函数有疑问。我从 php.ini 中删除了安全模式和 disabled_functions。

如果我从终端 (php print.php) 运行 php 脚本,它运行良好,但如果我从 Web 浏览器运行它,则没有任何反应。

这是脚本:

<?php

$output = shell_exec('lp print.php');
echo "<pre>$output</pre>";

?>

请帮助我。我在 Apache2 上运行 PHP 5.3.10。我的操作系统是 Ubuntu Server 12.4。这是phpinfo页面:http://testni-server.info/info.php

【问题讨论】:

  • 命令行和Web服务器是两个完全不同的环境。 CLI 在您的用户 ID 下运行,使用您的 shell 环境。在 webserver 下,它作为 webserver 的用户 ID 运行,带有 webserver 的 shell 环境。这是一个毫无意义的比较——苹果和橘子。唯一的共同点是它们都是水果(例如都是 PHP)。
  • 我一直在用同样类型的问题把头撞在桌子上。我终于发现 shell_exec(' stuff_here 2>&1') 会给我一个关于出了什么问题的错误。然后我能够从那里进行故障排除以解决问题。
  • 您好,我遇到了同样的问题,我使用的是 OpenBSD 6.4。和 php-5.6。任何人知道它的解决方案请告诉我。谢谢

标签: php shell shell-exec


【解决方案1】:

编程语言 PHP 允许通过配置指令 safe_mode_exec_dir 限制外部命令的执行。该指令应包含包含 PHP 脚本可以运行的程序的目录的完整路径。如果脚本尝试执行不在此目录中的命令,则不会执行该命令。此配置指令仅在启用安全模式时才有效,这意味着对用户的限制更多,有时甚至是不需要的限制。 PHP 没有已知的可能性来限制禁用安全模式的外部命令的执行。因此,这是一个将特殊指令 exec_dir 直接添加到 PHP 中的补丁。该指令与 safe_mode_exec_dir 非常相似,但不必启用安全模式。

此补丁限制或纠正了这些函数的行为:

exec()
passthru()
proc_open()
shell_exec()
system()
popen()
is_executable() 

创建补丁的目的是为了限制用户在多域 apache 服务器上执行外部命令,首先是针对 PHP 4.2.1 版本。该补丁被发送给 PHP 开发人员,因此它可以成为 PHP 的一部分,但没有一个 PHP 开发人员对此感兴趣。另一方面,一些 PHP 用户想要这个补丁,因此创建了这个站点。

【讨论】:

  • 换句话说,在 php.ini 和 httpd.conf 中关闭“php_admin_flag safe_mode”
【解决方案2】:

您的命令行 (CLI) PHP 可能使用与 CGI 不同的工作目录和/或路径。尝试在调用shell_exec() 之前使用chdir() 显式定义工作目录(包含lp 命令)。

【讨论】:

    猜你喜欢
    • 2013-03-24
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-25
    • 1970-01-01
    • 1970-01-01
    • 2013-08-07
    相关资源
    最近更新 更多