php(exec,system)执行外部程序问题?!!

您好,
我的linux环境是Fedora R12.我希望能透过php的system指令去执行自己开发的外部指令(例如:/usr/local/bin/abc). 档案和目录权限已是全开(777), 无论是不是绝对路径都试过均无法执行. 由php程序读取到的PATH环境变量如下.
_SERVER[PATH]=/sbin:/usr/sbin:/bin:/usr/bin
getenv(PATH)=/sbin:/usr/sbin:/bin:/usr/bin
_ENV[PATH]=/sbin:/usr/sbin:/bin:/usr/bin
开发的外部指令只能放进以上的path内才能被php看到并执行. 即使我在php内去ls /usr/local/bin 都无法正确得到结果. 环境变量也透过putenv增加/usr/local/bin, 但是新的环境变量值只出现在env中, _SERVER[]中还是旧的. 另外, 当我将passwd中的用户apache(php程序的执行者)的shell由/sbin/nologin改成/bin/csh, 再su成apache之后是可以ls /usr/local/bin, 并执行/usr/local/bin/abc的.
我希望自己开发的程序能放在自己的目录下执行, 请问该如何做?! 问题大概是出在哪?! 请帮帮忙, 谢谢!

----- 程式码
echo ' <br>6====== <br>';
echo "_SERVER[PATH]=".$_SERVER[PATH].' <br>';
echo "getenv(PATH)=".getenv(PATH).' <br>';
echo "_ENV[PATH]=".$_ENV[PATH];
echo ' <br>7====== <br>';
putenv("XYZ=TRACY");
putenv("PATH=" .$_ENV["PATH"].":/usr/local/bin");
putenv("ABC=ROGER");
echo "_ENV[PATH]=".$_ENV[PATH].' <br>';
echo "_SERVER[PATH]=".$_SERVER[PATH].' <br>';
echo "getenv(PATH)=".getenv(PATH).' <br>';
echo "_ENV[]=".$_ENV[XYZ].' <br>';
echo system('env > env.txt');
echo system('ls >> env.txt ; ls /usr/local/bin >> env.txt');
echo ' <br>8====== <br>';
echo exec('whoami');
-----浏览器画面
6======
_SERVER[PATH]=/sbin:/usr/sbin:/bin:/usr/bin
getenv(PATH)=/sbin:/usr/sbin:/bin:/usr/bin
_ENV[PATH]=/sbin:/usr/sbin:/bin:/usr/bin
7======
_ENV[PATH]=/sbin:/usr/sbin:/bin:/usr/bin
_SERVER[PATH]=/sbin:/usr/sbin:/bin:/usr/bin
getenv(PATH)=/sbin:/usr/sbin:/bin:/usr/bin
_ENV[XYZ]=
8======
apache
----- env.txt 内容
[root@fedora1 bin]# cat /var/www/html/roger/env.txt
ABC=ROGER
TERM=linux
XYZ=TRACY
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin
_=/bin/env
RUNLEVEL=5
runlevel=5
UPSTART_EVENT=runlevel
PWD=/var/www/html/roger
LANGSH_SOURCED=1
LANG=C
PREVLEVEL=N
previous=N
CONSOLETYPE=vt
SHLVL=4
UPSTART_JOB=rc5
UPSTART_JOB_ID=3
env.txt
index1.php
pp.txt
qq.txt
test1.php
zz.txt
------------------

Fedora 12 是SELinux, Security Enhanced Liux. 安全性特别加强. 由你的描述来看, 应该是SELinux的权限没打开.
在/etc/selinux/config 中将 SELINUX=enforcing 改成 SELINUX=disable即可, 如此便将SELinux中强化安全的部分完全关闭, 但也就变得和一般linux没多少差别. 改完后要reboot.
如果想要SELinux的安全功能又想达成你要的目的, 要参考 SELinux特有的chcon指令以及httpd_selinux语法.
例如,
chcon -R -t httpd_user_content_t /web
温馨提示:内容为网友见解,仅供参考
无其他回答
相似回答