如何在EC2 Linux上执行shell_exec

时间:2019-05-13 07:48:26

标签: php python amazon-ec2 shell-exec

我正在EC2 Linux实例上运行API。我尝试从PHP文件执行Python脚本。 PHP文件的路径为/var/www/html/droptop/api/event/test.php。 Python脚本的路径为/var/www/html/droptop/blacklist/profanity.py。 Python脚本会接收两个字符串,并通过亵渎检查检查这两个字符串之一是否包含令人反感的内容。如果未找到令人反感的内容,则返回 0 ,否则返回 1 。但是,shell_exec似乎总是返回NULL亵渎检查需要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)

这里可能是什么问题?

2 个答案:

答案 0 :(得分:0)

您应该删除这些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服务器,则可以尝试运行以下命令,希望可以为您提供一些线索:< / p>

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

可能的问题:

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

  • profanity_check模块未全局安装

答案 1 :(得分:0)

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

/ var / log / apache2

他们可能会指导您找出真正的问题所在。