Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/236.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php还是apache?exec、popen、system和proc_open命令不执行任何命令,甚至不执行ls_Php_Apache_Command - Fatal编程技术网

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

php还是apache?exec、popen、system和proc_open命令不执行任何命令,甚至不执行ls,php,apache,command,Php,Apache,Command,我的问题是从php主页执行任何命令 解决了一半,我运行了pythonscript,但pythonscript上的其他人没有执行其模块的权限 但是我开始认为问题在于apache而不是php?我试着运行一个pythonscript,它实际上就是我最后要运行的,然后它似乎运行了,但是当脚本试图访问一个类似下面这样的txt文件时,它停止了 [stdout] => [stderr] => Traceback (most recent call last): File "pythontest

我的问题是从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几乎什么都不运行,我可以从system(“pwd”)获得一个字符串,但system(“ls”)返回一个数字127或126。我还试着运行一个编译过的c程序(下面的代码),exec将返回一个对象“Array”,但系统只会像ls一样返回127或126

我还试图从“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>';
$cmd='ls /var/www/';
$variable_name=`$cmd`;
当test1程序拥有完全权限时,为什么它给我拒绝的权限

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

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

C源代码

/**
 * 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 );
}
intmain(intargc,char*argv[])
{
int i;
对于(i=0;i
安全模式正在运行吗?您是否试图访问安全模式\u exec\u dir之外的文件

“当启用安全模式时,只有位于安全模式\u exec\u dir中的可执行文件才允许通过exec函数系列执行。”


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

安全模式正在运行吗?您是否尝试访问安全模式\u EXEC\u dir之外的文件

“当启用安全模式时,只有位于安全模式\u exec\u dir中的可执行文件才允许通过exec函数系列执行。”


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

以下是要添加到列表中的其他功能:)

您案例的使用示例:

echo';
打印(执行('ls'));
回声';
上面的函数提供了比直接使用PHP函数更多的特性。它可以帮助您进行调试,尽管它更适合于生产代码

一般来说,这是您应该注意的:

  • 你不是在安全模式下
  • 您的可执行文件确实存在
  • 您的可执行文件是可运行的-知道FTP客户端通常使用ASCII/文本模式,更改上载文件中的CRLF,从而损坏它们
  • 确保chmod您的可执行文件至少755

    • 下面是要添加到列表中的另一个函数:)

      您案例的使用示例:

      echo';
      打印(执行('ls'));
      回声';
      
      上面的函数提供了比直接使用PHP函数更多的特性。它可以帮助您进行调试,尽管它更适合于生产代码

      一般来说,这是您应该注意的:

      • 你不是在安全模式下
      • 您的可执行文件确实存在
      • 您的可执行文件是可运行的-知道FTP客户端通常使用ASCII/文本模式,更改上载文件中的CRLF,从而损坏它们
      • 确保chmod您的可执行文件至少755
      //正如内莫登所说,使用(背面勾选):

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

      //正如Nemoden所说的使用(回勾):

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

      问题在于目录的权限。 路径中位于您上方的每个目录都必须具有 至少要有阅读权限,所以如果你想

      # mkdir /public
      # chmod 744 /public
      # mv /root/testdir /public
      
      你们两个都要

      注意:从安全角度来看,这不是一个好主意。 相反,也许:


      请注意,这里744将应用于test_dir

      问题在于目录上的权限。 路径中位于您上方的每个目录都必须具有 至少要有阅读权限,所以如果你想

      # mkdir /public
      # chmod 744 /public
      # mv /root/testdir /public
      
      你们两个都要

      注意:从安全角度来看,这不是一个好主意。 相反,也许:


      请注意,这里744将应用于测试echo'ls'产生的内容(替换为back ticks)。如果“command not found”结果持续出现在
      /bin/ls
      中,那么您很可能在mod_chroot/jail中运行您的Web服务器。(这是一种安全预防措施,实际上只起一次作用。)默认情况下安装了Web服务器,所以我不知道这是否是个问题?Web服务器是apache/2.2.3,如果这可能是echo“ls”产生的任何帮助?(用反勾号替换)如果“command not found”结果持续出现在
      /bin/ls
      中,则您可能正在mod_chroot/jail中运行Web服务器。(一个安全预防措施,实际上只起一次作用。)默认情况下安装了Web服务器,所以我不知道这是否会有问题?如果可能是任何helpArray([stdout]=>[stderr]=>sh:ls:command not found[return]=>127),则Web服务器为apache/2.2.3这是函数的输出,如果为ls提供了完整路径,则返回126退出代码127已经存在。它为126 stdout/stderr返回了什么?@DavidS:如果它说“未找到命令”,则检查
      print\r($\u SERVER)
      用于
      路径
      变量。或者按照您的建议尝试
      /bin/ls
      。当我使用bin/ls时,答案是数组([stdout]=>[stderr]=>sh:/
      $cmd='ls /var/www/';
      $variable_name=`$cmd`;
      
      # ls /root/test_dir
      
      # chmod 777 /root/test_dir
      # chmod 777 /root
      
      # mkdir /public
      # chmod 744 /public
      # mv /root/testdir /public