php还是apache? exec,popen,system和proc_open命令不执行任何命令,甚至不执行ls

时间:2011-04-15 07:40:00

标签: php apache command

我的问题是从我的php主页执行任何命令

一半解决了,我的pythonscript运行了但是pythonscript的进一步没有执行模块的权限

但我开始认为问题是apache而不是php?我试图运行一个pythonscript,实际上我将要运行到底,然后它似乎运行但停止脚本试图访问看起来像这样的txt文件

[stdout] =>
[stderr] => Traceback (most recent call last): 
 File "pythontest.py", line 4, in ? f = open("(path)/temp.txt", "w") 
 IOError: [Errno 13] Permission denied: '(path)/temp.txt'

我尝试了所有不同类型的执行方法,我可以找到exec,system,popen,proc_open几乎没有运行,我可以从系统中获取一个字符串(“pwd”)但系统(“ls”)返回一个数字127或者126.我也尝试运行一个已编译的c程序(下面的代码),exec将返回一个对象“Array”,但系统只返回127或126作为ls。

我还试图从“Array”对象中获取值吗?从exec但它什么都不返回,如果我在php print_R数组中页面不会加载。

php输出是(下面的代码) - > a:,out1:126,t [[0] :, strlen out:5,out:Array,t: 无论我真正投入多少论点!

ls的完整路径给出了126,只有“ls”给出了数字127

我已经测试过chmod所有文件到完全权限,从page.php到测试程序但它仍然提供相同的输出

php安全模式已关闭

echo '<pre>';
print_r(execute('ls'))
echo '</pre>';

返回

array
(
    [stdout] => 
    [stderr] => sh: /var/www/html/grndb/upscgenesearch/test1: Permission denied

    [return] => 126
)

为什么在test1程序获得完全许可时,它会拒绝权限?

<?php
$a = system("/bin/ls",$out1);
echo "a: "; echo $a;
echo ", out1: "; echo $out1;
$t = exec('pwd/test1 aa hh 11',$out);

foreach ($t as &$value) {
    echo ($value);
}

echo ", t[[0]: "; echo $t[0]; 
echo ", strlen out: "; echo strlen($out);
echo ", out: "; echo $out; 
echo ", t: "; echo $t;
?>

C源代码

int main(int argc, char *argv[])
{
int i;

for(i = 0; i < argc; i++)
printf("arg %d: %s\n", i, argv[i]);
return 0;
}

4 个答案:

答案 0 :(得分:3)

以下是添加到列表:)

的其他功能
/**
 * Executes a program and waits for it to finish, taking pipes into account.
 * @param string $cmd Command line to execute, including any arguments.
 * @param string $input Data for standard input.
 * @return array Array of "stdout", "stderr" and "return".
 * @copyright 2011 K2F Framework / Covac Software
 */
function execute($cmd,$stdin=null){
    $proc=proc_open($cmd,array(0=>array('pipe','r'),1=>array('pipe','w'),2=>array('pipe','w')),$pipes);
    fwrite($pipes[0],$stdin);                      fclose($pipes[0]);
    $stdout=stream_get_contents($pipes[1]);        fclose($pipes[1]);
    $stderr=stream_get_contents($pipes[2]);        fclose($pipes[2]);
    $return=proc_close($proc);
    return array( 'stdout'=>$stdout, 'stderr'=>$stderr, 'return'=>$return );
}

您案件的使用示例:

echo '<pre>';
print_r(execute('ls'));
echo '</pre>';

上述功能提供的功能比直接使用PHP功能更多。它可以帮助您进行调试,但它更适用于生产代码。

一般来说,这是你应该注意的事情:

  • 您未处于安全模式
  • 您的可执行文件确实存在
  • 您的可执行文件 可运行 - 知道FTP客户端经常使用ASCII /文本模式,更改上传文件中的CRLF,从而破坏它们
  • 请确保至少755
  • chmod您的可执行文件

答案 1 :(得分:1)

安全模式正在运行吗?您是否尝试访问safe_mode_exec_dir以外的文件?

“当safe_mode打开时,只允许通过exec系列函数执行位于safe_mode_exec_dir中的可执行文件。”

您是自己的服务器还是共享主机?出于安全考虑,某些主机将禁用EXEC功能的运行。

答案 2 :(得分:1)

问题是目录的权限。 您路径上的每个目录都必须具有 至少读取权限。因此,如果你想

# ls /root/test_dir

你必须要两个

# chmod 777 /root/test_dir
# chmod 777 /root

注意:这是一个安全POV的坏主意。 而不是:

# mkdir /public
# chmod 744 /public
# mv /root/testdir /public

请注意,这里的744将适用于test_dir

答案 3 :(得分:-1)

//正如Nemoden说的那样使用(后退):

$cmd='ls /var/www/';
$variable_name=`$cmd`;

如果您不想存储值,请使用passthru命令。 exec和system命令只显示一行(断行后的数据被切断)