PHP脚本执行exec函数以在bash中编译C脚本会引发错误

时间:2018-09-06 08:47:49

标签: php bash

我一直在关注此answer,但我不知道自己到底在做什么错。当我(通过邮递员)调用api端点时,当脚本尝试生成和编译脚本c脚本时,出现以下错误。

我的php代码

        exec('
cat > wrapper.c <<CONTENT
  #include <stdlib.h>
  #include <sys/types.h>
  #include <unistd.h>

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

     system ("/bin/sh /var/www/html/myapp/script.sh");

     return 0;
   }
CONTENT
gcc wrapper.c -o php_root 2>&1
',  $output, $returnVar);

        var_dump($output);
        var_dump($returnVar);
        die();

我得到的错误是gcc: error trying to exec 'cc1': execvp: No such file or directory',该错误在执行gcc wrapper.c -o php_root 2>&1命令时发生

在bash中运行所有这些命令都可以正常工作,但是当通过PHP exec执行它们时,我得到了错误。

gcc -v
(venv) certify-dev: /var/www/html/certify/public $ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 5.4.0-6ubuntu1~16.04.10' --with-bugurl=file:///usr/share/doc/gcc-5/README.Bugs --enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-5 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-5-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-5-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-5-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.10) 

您能帮我找出问题所在吗? 如果您还有其他问题,请让我知道,我们将提供答案。谢谢!

更新

@squeamish通知我,我应该提供完整的gcc路径,这是一种情况,但是现在我又遇到了一个错误

更新的行

/usr/bin/gcc wrapper.c -o php_root 2>&1

错误

  0 => string 'collect2: fatal error: cannot find 'ld'' (length=39)
  1 => string 'compilation terminated.' (length=23)

2。更新

检查我的php路径(由@ChrisTurner建议)后,我发现我的shell缺少php可执行文件...

我的php代码

$phpFinder = new PhpExecutableFinder;
    if (!$phpPath = $phpFinder->find()) {
        throw new \Exception('The php executable could not be found, add it to your PATH environment variable and try again');
    }
    var_dump($phpPath); /usr/bin/php
    var_dump(PHP_BINDIR); /usr/bin/php

和外壳

dev: /var/www/html/myapp $ sudo -H -u www-data bash -c 'echo $PATH'

输出

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/go/bin

这就是为什么我在〜/ .bashrc中添加export PATH="$PATH:/usr/bin/php"的原因,这是我现在在bash中使用的PATH

myApp: /var/www/html/certify $ sudo -H -u www-data bash -c 'echo $PATH'
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/go/bin:/usr/bin/php

代码仍然抛出错误 'collect2:致命错误:找不到'ld'

1 个答案:

答案 0 :(得分:1)

遇到的问题是您试图运行“ gcc”,但是PHP找不到它或它运行的任何子程序来执行编译或链接。这是因为未设置PATH环境变量。此变量定义了一个目录列表,如果未提供完整路径,则将搜索该目录以查找程序。

要在Symfony环境中修复它,您需要将变量添加到.env文件中。例如,遵循以下内容

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"