大家好,现在我有一个文件a.php.内容是:<?
$str = " /opt/rpm/bin/rpm -bb --target i686--linux /tmp/test.spec";
system($str);?>
当我用http://192.168.1.1/a.php 执行的时候结果显示:
Building target platforms: i686--linux Building for target i686--linux Processing files: VTCUAL06.06C.P010-R1.0-P1 当我在命令行下用/usr/local/php a.php 执行的时候,结果显示:Building target platforms: i686--linux
Building for target i686--linux
Processing files: VTCUAL06.06C.P010-R1.0-P1
Finding  Provides: (using /opt/rpm/lib/rpm/find-provides)...
Finding  Requires: (using /opt/rpm/lib/rpm/find-requires)...
Wrote: /export/home/webadm/.rpm/RPMS/i686/VTCUA
也就是说在http访问模式下有三行没有显示出来:Finding  Provides: (using /opt/rpm/lib/rpm/find-provides)...
Finding  Requires: (using /opt/rpm/lib/rpm/find-requires)...
Wrote: /export/home/webadm/.rpm/RPMS/i686/VTCUA
有人知道是什么原因吗?谢谢了!!

解决方案 »

  1.   

    一点不奇怪,执行用户不同而已。命令行执行的是root,网页执行的是apache用户。
    google了一下,说apache带--enable-suexec编译就可以,但是没试过。
      

  2.   

    而且,我在命令行下也是用的apache的用户执行的。
      

  3.   

    你在用system命令是记得加上sudo,这样应该可以。
      

  4.   

    没有变动过什么。系统solaris8.
      

  5.   

    出现问题后重启了apache,但还是不行。
      

  6.   

    看看以 php 命令行方式执行你的程序的结果
      

  7.   

    结果我已经在主帖子里谢了。
    Building target platforms: i686--linux
    Building for target i686--linux
    Processing files: VTCUAL06.06C.P010-R1.0-P1
    Finding  Provides: (using /opt/rpm/lib/rpm/find-provides)...
    Finding  Requires: (using /opt/rpm/lib/rpm/find-requires)...
    Wrote: /export/home/webadm/.rpm/RPMS/i686/VTCUA
      

  8.   

    噢,没注意
    这显然是用于权限的问题了
    web 方式下的 php 只是匿名用户,只有最低的权限话说回来,如果什么都可以通过浏览器去操控,那么系统哪有安全性可言想当初微软为了提供便利的数据查询,给 mssql2000 附加了 url 查询功能
    结果不就被人利用,而成了臭名昭著的 SQL攻击
      

  9.   

    都说了是权限问题,你加了sudo了没,结果怎样?
      

  10.   

    solaris 没有sudo吧。而且我测试过了apache的用户和在命令行下是同一个用户。
      

  11.   

    应该有的,如果没有你wget下载安装一个。
      

  12.   

    后面没有输出我怀疑可能出错了,你试试看一下代码,然后告诉我结果。function my_exec($cmd, $input='') 
             {$proc=proc_open($cmd, array(0=>array('pipe', 'r'), 1=>array('pipe', 'w'), 2=>array('pipe', 'w')), $pipes); 
              fwrite($pipes[0], $input);fclose($pipes[0]); 
              $stdout=stream_get_contents($pipes[1]);fclose($pipes[1]); 
              $stderr=stream_get_contents($pipes[2]);fclose($pipes[2]); 
              $rtn=proc_close($proc); 
              return array('stdout'=>$stdout, 
                           'stderr'=>$stderr, 
                           'return'=>$rtn 
                          ); 
             }
    $str = " /opt/rpm/bin/rpm -bb --target i686--linux /tmp/test.spec";
    var_export(my_exec($str));
      

  13.   

    不清楚,关了安全模式吧?我只听说system函数是显示最后一行结果的..但你的又不是最后一行,好奇怪
      

  14.   

    标准输出重定向到文件 看看文件中是否存在着三行信息<?
    /*如果输出还是少那三行,就在rpm执行上添加vv参数看看在哪儿停住的,错误信息是什么*/
    $str = " /opt/rpm/bin/rpm -bb --target i686--linux /tmp/test.spec > info.txt";
    system($str);?>
      

  15.   

    谢谢各位,特别感谢Meteorlet,根据Meteorlet提供的函数找到了错误原因,是路径错误,就是spec文件中的一个参数BuildRoot:        %_tmppath 这里读取到了错误的值。所以不行了。