我正在使用这个 php 代码:
exec("unrar e file.rar",$ret,$code);
并获得非法命令的错误代码,即 127 ...但是当我通过 ssh 使用此命令时,它的工作...因为服务器上安装了 unrar ...所以任何人都可以猜到为什么 exec 没有做正确的事情吗?
尝试使用应用程序的直接路径(/usr/bin/unrar 之类的),听起来 php 找不到应用程序。
如果您已经 chrooted apache 和 php,您还需要将 /bin/sh 放入 chrooted 环境中。否则,exec() 或 passthru() 将无法正常运行,并会产生错误代码 127,找不到文件。
由于这是谷歌的最佳答案,我想分享我的修复:
我的简单修复是在 php.ini 文件中禁用 safe_mode
; Safe Mode
; http://www.php.net/manual/en/ini.sect.safe-mode.php#ini.safe-mode
safe_mode = Off
谢谢大家的回复!!
我试过这个
//somedir is inside the directory where php file is
chdir("somedir");
exec("/home/username/bin/unrar e /home/path/to/dir/file.rar");
现在它没有返回退出代码……其他命令正在执行文件……我尝试了 mkdir 等……:s
以防万一其他人仍然遇到此问题,请查看此处的帖子:
http://gallery.menalto.com/node/2639#comment-8638
引用:
我发现了问题。问题出在我的安全偏执的 OpenBSD 上。从 3.1 升级到 3.2 时,他们添加了:
- Apache 默认运行 chroot'd。要禁用此功能,请参阅新的 -u 选项。
chroot 阻止 Apache 访问目录之外的任何内容,因此我将所有内容都移到了 apache 目录中,包括 netpbm。一切都可以访问和执行,但我猜它仍然处于某种“安全模式”,因为 exec() 总是返回 127。
无论如何,使用 -u 选项运行 httpd 会回到不太安全的非 chroot'd apache 启动,这允许 exec() 再次工作。
ohkiee guyz thanx ...是的,$PATH 可能存在一些错误...但是在给定完整路径的情况下它可以工作:)
exec("/home/user/bin/unrar e /home/user/xxx/yyy/file.rar");