Как выполнить shell_exec в EC2 Linux - PullRequest
0 голосов
/ 13 мая 2019

Я использую API на экземпляре EC2 Linux. Я пытаюсь выполнить скрипт Python из файла PHP. Путь к файлу 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 пользователь выполняет файлы. Однако я также изменил файл 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)

В чем здесь проблема?

1 Ответ

0 голосов
/ 13 мая 2019

Вы должны удалить эти 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()

Теперь вернемся к исходному вопросу: документы говорят

Эта функция может возвращать NULL как при возникновении ошибки, так и при выполнении программы. не выводит вывод.

Вы можете откомментировать строку //echo $output; и, предполагая, что вы используете веб-сервер Apache, работающий как пользователь apache, вы можете попытаться запустить команду ниже, надеюсь, это даст вам некоторую подсказку:

$ 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 модуль не установлен глобально

...