我正在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)
这里可能是什么问题?
答案 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
他们可能会指导您找出真正的问题所在。