如何在 EC2 Linux 上执行 shell_exec

How to execute shell_exec on EC2 Linux

我是 运行 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 检查这两个字符串之一是否包含令人反感的内容。如果没有发现令人反感的内容,则 returns 0,否则 returns 1。然而,shell_exec似乎总是returnNULL亵渎检查 需要 Python 3 才能正常工作。

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

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

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

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

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

仍然总是 returns 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)

这可能是什么问题?

您应该删除这些 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

This function can return NULL both when an error occurs or the program produces no output.

您可以 un-comment //echo $output; 行,假设您正在使用 Apache Web 服务器 运行ning 作为 apache 用户,您可以尝试 运行下面的命令,希望这会给你一些线索:

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

可能的问题:

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

  • profanity_check模块没有全局安装

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

/var/log/apache2

他们可能有助于了解真正的问题是什么。