#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]); .