繁体   English   中英

php脚本执行exec函数在bash中编译c脚本抛出错误

[英]Php script executing exec function for compiling c script in bash throws error

我一直在关注这个答案,但我无法弄清楚我到底做错了什么。 当我调用我的 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. 更新

在检查了我的 PATH(@ChrisTurner 建议)的 php 后,我发现我的 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

这就是为什么我将export PATH="$PATH:/usr/bin/php"到我的 ~/.bashrc 中,这是我现在在 bash 中的export PATH="$PATH:/usr/bin/php"

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''

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM