【问题标题】:php shell_exec() command is not workingphp shell_exec() 命令不起作用
【发布时间】:2013-12-06 02:54:36
【问题描述】:

我正在尝试从 php 运行 .sh 文件。 我试着用 shell_exec() 来做。但它不工作 我在堆栈溢出中提到了许多与此相关的问题,但无法解决

我的php代码是(web.php)

    <?php
    echo shell_exec('/var/www/project/xxe.sh');
    echo "done";
    ?>

只打印完成。但它正在从终端工作(php /var/www/project/web.php)

在 xxe.sh 我正在调用一个 python 文件

    python vin.py

我还将两个 .sh n .py 文件的文件权限更改为 777 请帮忙

【问题讨论】:

  • 您如何确定它“不工作”? vin.py 有哪些你期待但没有看到的副作用?
  • 根据docs,“使用此函数无法检测执行失败。需要访问程序退出代码时应使用exec()”
  • 在 python 文件中,我试图将一些值存储到数据库中。当我在浏览器上运行 php 文件时,它不存储任何值

标签: php shell python-2.7


【解决方案1】:

如果你说它在终端上运行而不是在 apache 上运行,那么 apache 的 php.ini 文件可能会禁用 shell_exec()

http://www.php.net/manual/en/ini.core.php#ini.disable-functions

您的 apache 的 php.ini 文件可能类似于

disable_functions=exec,passthru,shell_exec,system,proc_open,popen

从该列表中删除shell_exec 并重新启动网络服务器,虽然这是一个安全风险,我不建议这样做。

【讨论】:

  • 可能还想检查目录限制,如果服务器不存在并且仅用于开发,则尝试暂时打开php.ini 看看是否有区别。
  • 对不起,我没有得到。我该怎么办?
  • 您是否在安全模式下运行 php?还请阅读此处的 cmets us2.php.net/shell_exec,因为其中一些似乎很有帮助。
  • 大多数网络托管服务默认禁用此选项,并且不允许您启用它..
【解决方案2】:

如果它在 shell 中运行良好,我认为 apache 是 chrooted。所以php找不到/var/...

或者httpd用户的用户没有权限进入/var/...

如果你擅长 PHP。打开 dir /var/... 和 readdir() 并检查 dir 是否存在并检查文件是否存在。

这个问题可能会对你有所帮助。 scanning /home/ with opendir()

【讨论】:

  • $ ls -ld /var/ drwxr-xr-x 14 root root 4096 Dec 31 21:20 /var/ $ ls -ld /var/www drwxrwxrwx 6 root root 4096 Nov 18 02:00 /var/www
  • 不是来自 shell,使用 diropen() 和 readdir() 在 php 中列出目录,并通过 web 打开 php。这是一种检查apache可以查看/var/的方法...如果你不知道如何目录列表,google
  • Works:" 。 $f 。 ""; } ?> 这是你在说的代码吗?
  • 是的。有用?那你可以试试这个吗? system("/var/www/project/xxe.sh > /tmp/a.txt 2>&1") a.txt里面有什么吗?
  • 如果是这样,我认为 apache 无法访问该目录。我不知道的原因,但这个链接可以帮助你。 stackoverflow.com/questions/7188806/scanning-home-with-opendir
【解决方案3】:

我在这里尝试了一切,但没有任何效果。 最终为我解决的问题是在 shell_exec 之前使用以下内容:

putenv('PATH=/usr/local/bin');

【讨论】:

    【解决方案4】:

    在尝试运行由 github post-receive webhook 触发的脚本时。

    这是我的项目目录所在的位置(克隆的 git repo):

    /var/www/html/my-repo
    

    我在上面的目录中创建了一个名为 webhook.php 的脚本:

    <?php
    #webhook.php
    
    $cmd = shell_exec("git pull 2>&1");
    
    #for debugging
    echo $cmd;
    ?>
    

    在/var/www/html里面执行下面的命令

    sudo chown www-data:www-data -R my-repo/
    

    前往http://www.myserver.com/my-repo/webhook.php进行测试

    将脚本的路径添加到 github webhooks。

    【讨论】:

      【解决方案5】:

      问题通常是当您从 php 中执行代码时,它在许多 linux 发行版中以网络服务器用户 www-data 的身份运行。通常,此用户没有设置环境,因此没有 PATH。通过在文件中使用完整路径,您通常可以克服这个问题。

      xxe.sh

      /usr/bin/python /path/to/script/vin.py
      

      【讨论】:

        【解决方案6】:

        我已经被这个问题困了几个小时了。

        我已经想到了一个解决方案。 1. 将您的脚本移动到 python 文件“script.py”并将此文件放置到您的服务器根目录。 2. shell_exec("python script.py");

        不管怎样,它对我有用。

        【讨论】:

          【解决方案7】:

          在我的主机上,我必须为要从 shell_exec() 执行的 php 文件提供不同的路径。 这不起作用shell_exec('/usr/bin/php backgroundtask.php');

          虽然这样做了shell_exec('/opt/php/php-5.5.0/bin/php backgroundtask.php');

          您可以访问this Reference.

          【讨论】:

            【解决方案8】:

            我遇到了同样的问题,因为 PHP 反斜杠。

            PHP 转义了反斜杠,因此到达 shell 的命令

            'COPY E:path1\path2\file.prn /B \127.0.0.1\"PRINTER NAME"'
            

            所以我给了这样的命令

            'COPY E:\\path1\\path2\\file.prn /B \\\\127.0.0.1\"PRINTER NAME"'. 
            

            您必须对反斜杠进行两次转义:一次用于 PHP,一次用于 shell。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2018-06-28
              • 2014-11-25
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-03-31
              相关资源
              最近更新 更多