【问题标题】:How to execute shell_exec on EC2 Linux如何在 EC2 Linux 上执行 shell_exec
【发布时间】:2019-09-30 03:33:07
【问题描述】:

我在 EC2 Linux 实例上运行 API。我尝试从 PHP 文件执行 Python 脚本。 PHP 文件的路径是/var/www/html/droptop/api/event/test.php。 Python 脚本的路径是/var/www/html/droptop/blacklist/profanity.py。 Python 脚本接收两个字符串,并通过 Profanity Check 检查这两个字符串之一是否包含令人反感的内容。如果没有发现令人反感的内容,则返回 0,否则返回 1。但是,shell_execalways 似乎返回 NULLProfanity Check 需要 Python 3 才能正常工作。

在命令行上执行时,PHP 文件和 Python 脚本完美地协同工作。

我认为这与用户的权限有关。 apache 而不是 www-data 用户正在执行文件。不过,我也根据here更改了sudoers文件。我包括以下几行:

apache ALL=NOPASSWD:/var/www/html/droptop/blacklist/profanity.py
apache ALL=NOPASSWD:/usr/bin/python3.6

我还检查了apache 是否是groups 的一部分。

我还尝试了其他功能,例如exec()system()passthru()

但它总是返回NULL

test.php

$command = escapeshellcmd('python3 /var/www/html/droptop/blacklist/profanity.py Some BadWord');
$output = shell_exec($command);

if($output == 0) {
  echo json_encode(array("message" => "No Badword found."));
}

profanity.py

#!/usr/bin/python36

from profanity_check import predict, predict_prob
import sys

# get title
title = sys.argv[1]
pred_title = predict([title])
pred_details = 0

if(len(sys.argv) == 3):
    details = sys.argv[2]
    pred_details = predict([details])

if((pred_title == 0) and (pred_details == 0)):
    print(0)
else:
    print(1)

这可能是什么问题?

【问题讨论】:

    标签: php python amazon-ec2 shell-exec


    【解决方案1】:

    您应该删除这些 sudoers 条目,在您的情况下它们不应该是必需的,并且存在安全风险。

    我还建议不要中继输出,而是使用退出状态:

    test.php

    <?php
    $command = escapeshellcmd('python3 /var/www/html/droptop/blacklist/profanity.py Some BadWord');
    exec($command, $output, $return_var);
    
    //echo $output;
    
    if(!$return_var) {
      echo json_encode(array("message" => "No Badword found."));
    }
    ?>
    

    profanity.py

    import sys
    
    from profanity_check import predict
    
    
    def profanity(words):
        return predict(words)
    
    def main():
        words = sys.argv[1:]
        ret = profanity(words)
        sys.exit(any(ret))
    
    if __name__ == '__main__':
        main()
    

    现在,回到你原来的问题,docs

    此函数在发生错误或程序运行时都可以返回 NULL 不产生任何输出。

    您可以取消注释//echo $output; 行并假设您正在使用以apache 用户身份运行的Apache Web 服务器,您可以尝试运行以下命令,希望这会给您一些线索:

    $ runuser -l apache -s /bin/bash -c "php -f /var/www/html/droptop/api/event/test.php; echo"
    {"message":"No Badword found."}
    

    可能的问题:

    • 您的 python 安装不在$PATH for apache 用户中

    • profanity_check 模块未全局安装

    【讨论】:

      【解决方案2】:

      尝试检查错误日志 Web 的服务器访问点由 Web 服务器控制 可能是您要写入的文件存在权限问题。 例如,我试图写入“用户”拥有的文件,但 apache“www-data”没有权限 查看里面的错误日志:

      /var/log/apache2

      它们可能有助于了解真正的问题。

      【讨论】:

        猜你喜欢
        • 2021-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-16
        • 2018-12-08
        • 2011-01-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多