如何在 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
他们可能有助于了解真正的问题是什么。
我是 运行 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
他们可能有助于了解真正的问题是什么。