Передача переменных с дополнительными параметрами из PHP в Python

#php #python #shell #escaping

#php #python #оболочка #экранирование

Вопрос:

Мне нужно передать аргумент из нескольких слов из PHP в Python.

Передача только одного слова не представляет проблемы, однако, как мне добавить дополнительный параметр, который приведет к успешному решению?

Я пробовал несколько способов передачи дополнительного параметра без какого-либо успеха, это приводит либо к внутренней ошибке сервера 500, либо к отсутствию ответа от скрипта python. Использование 2> amp; 1 также не возвращает никаких сообщений об ошибках.

Существует шесть случаев, когда дополнительные параметры являются необязательными или обязательными для успешного ответа.

Я могу отправить аргумент с одним словом:

 $command = escapeshellcmd("python /home/nova_api.py 'getwithdrawalhistory' 2>amp;1");
  

Это вернет правильный ответ:

 {"items":[],"message":"Your trade history with recent first","page":1,"pages":0,"perpage":100,"status":"success","total_items":0} 
  

Мои попытки передать дополнительный параметр из PHP в Python:

 $command = escapeshellcmd("python /home/nova_api.py 'getwithdrawalhistory, { 'page': 1 }' 2>amp;1");

$command = escapeshellcmd("python /home/nova_api.py 'getwithdrawalhistory, { 'page': '1' }' 2>amp;1");

$command = escapeshellcmd("python /home/nova_api.py 'getwithdrawalhistory, { 'page': "1" }' 2>amp;1");
  

Все три приводят к пустой странице — ответа нет и ошибка не возвращается.

Ответ №1:

Вы поступаете правильно, экранируя, но использование escapeshellcmd — это не то, что вы хотите. Он не имеет понятия аргументов, поэтому работает не так, как вы ожидаете. PHP предоставляет метод для цитирования и экранирования отдельных аргументов команд оболочки:

 <?php
$cmd = "python";
$args = [
    "/home/nova_api.py",
    "getwithdrawalhistory, { 'page': 1 }",
];
// just a fancy way of avoiding a foreach loop
$escaped_args = implode(" ", array_map("escapeshellarg", $args));
$command = "$cmd $escaped_args 2>amp;1";
  

Комментарии:

1. Этот код делает то же самое, однако он по-прежнему приводит к пустой странице или отсутствию ответа. Я считаю, что это как-то связано с передачей целого числа из php в python. В качестве простого решения на данный момент я использую четыре шага; 1 — подготовьте команду в php ‘getwithdrawalhistory’, { ‘страница’: 1 } , 2 — добавьте команду в файл python, используя (‘fwrite($fp, ‘print api_query( ‘getwithdrawalhistory’, {‘страница’: 1 } )’);’) , 3 — выполните команду и верните результаты в файл php, 4 — удалите подготовленную команду из файла python из php unset($lines[$last]); .