LINUX.ORG.RU

Мистика на связке Python+PHP при вызове из под Apache

 ,


0

1

Доброе!

Есть некий скрипт на Python3, который смотрит первый параметр строки запуска который в base64, и декодирует его в json:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
st=str(sys.argv[1]).encode("utf-8");
param=json.loads(base64.b64decode(st).decode("unicode_escape"))
pprint(param);

Скрипт этот запускаем из скрипта на php:

<?php
$res=`/usr/bin/env python3 /var/www/noc/jobs/atol/libfptr10.py eyJtb2RlIjoicHJpbnRfZWwiLCJudW1jaGVjayI6IjY2NjA2MCIsImRvY2RhdGUiOiIyMDE4LTA2LTE1IDEyOjQwOjQyIiwic3VtbWRvYyI6IjE5NTAiLCJkb2dudW0iOiIzMDAwMDAxMTg1IiwiZW9ycGhvbmUiOiJtYWlsQG1haWwucnUiLCJpcGFkZHJlc3MiOiIxOTIuMTY4LjAuMTA0IiwiaXBwb3J0IjoiNTU1NSIsIm1vZGVsIjoiNjIiLCJhY2Nlc3NwYXNzIjoiMCIsInVzZXJwYXNzIjoiMzAiLCJwcm90b2NvbCI6IjIiLCJsb2dmaWxlbmFtZSI6IlwvdmFyXC9sb2dcL2trdC5sb2ciLCJ0ZXN0bW9kZSI6IjEiLCJsaWJwYXRoIjoiXC9ob21lXC9wYXZlbFwvcmVzZXJ2ZWRcL2dldGNvZGluZ1wvYXRvbFwvdGVzdFwvdmVyMTBcLyIsImthc3NpciI6Ilx1MDQxZlx1MDQ0M1x1MDQzZlx1MDQzYVx1MDQzOFx1MDQzZCBcdTA0MWYuXHUwNDE4LiIsImlubmsiOiIyMzQyMjQzMjg3MCJ9`;
echo $res;
?>

Если его вызываем из терминала, то всё замечательно:

pavel@pavelpc:/var/www/noc# php tt.php
{'accesspass': '0',
 'docdate': '2018-06-15 12:40:42',
 'dognum': '3000001185',
 'eorphone': 'mail@mail.ru',
 'innk': '23422432870',
 'ipaddress': '192.168.0.104',
 'ipport': '5555',
 'kassir': 'Пупкин П.И.',
 'libpath': '/home/pavel/reserved/getcoding/atol/test/ver10/',
 'logfilename': '/var/log/kkt.log',
 'mode': 'print_el',
 'model': '62',
 'numcheck': '666060',
 'protocol': '2',
 'summdoc': '1950',
 'testmode': '1',
 'userpass': '30'}

Но! Если тот-же самый код вызываем из браузера (сервер апач, запущен под pavel):

http://127.0.1.2/tt.php, то в вывод идет только:

{'accesspass': '0', 'docdate': '2018-06-15 12:40:42', 'dognum': '3000001185', 'eorphone': 'mail@mail.ru', 'innk': '23422432870', 'ipaddress': '192.168.0.104', 'ipport': '5555', 'kassir': 

Т.е. явно не нравится русская кодировка. В чем проблема, ну никак понять не могу..

P.S. Помидорами прошу не кидать, ТАК НУЖНО. Большой проект на PHP, а кусок кода нужно чтоб выполнялся именно на python3 (ну нет заголовков работы с драйверами Атол для PHP). Да и примеры все на python для Атол.

а у пользователя, под которым запущен php, какая локаль?

ну и попробуй под ним вручную запустить.

bvn13 ★★★★★ ()

а, еще хороший вариант - напиши на питоне мини веб-сервер. это лучше, чем из консоли запускать

bvn13 ★★★★★ ()
Ответ на: комментарий от bvn13

Что апач, что скрипт выполняются под одним и тем-же пользователем: pavel

pavel@pavelpc:/var/www/noc# ps -aux | grep apa /usr/sbin/apache2 -k start pavel 16361 0.0 0.1 348344 4960 ? S 15:21 0:00 /usr/sbin/apache2 -k start pavel 16362 0.0 0.2 348956 9676 ? S 15:21 0:00 /usr/sbin/apache2 -k start

donpadlo ()
Ответ на: комментарий от bvn13

Т.е. добавлять в код еще одно «слабое звено»? За которым нужно следить чтобы он не упал, был запущен и т.д. Нет уж, как раз это и костыль.

donpadlo ()
Ответ на: комментарий от micronekodesu

Вывело:

('{«mode»: «print_el», «numcheck»: «666060», «docdate»: «2018-06-15 12:40:42», ' '«summdoc»: «1950», «dognum»: «3000001185», «eorphone»: «mail@mail.ru», ' '«ipaddress»: «192.168.0.104», «ipport»: «5555», «model»: «62», «accesspass»: ' '«0», «userpass»: «30», «protocol»: «2», «logfilename»: «/var/log/kkt.log», ' '«testmode»: «1», «libpath»: ' '«/home/pavel/reserved/getcoding/atol/test/ver10/», «kassir»: ' '«\\u041f\\u0443\\u043f\\u043a\\u0438\\u043d \\u041f.\\u0418.», «innk»: ' '«23422432870»}')

Но мне структура нужна. Когда делаю снова:

st=sys.argv[1]; param=json.loads(base64.b64decode(st)) zx=json.loads(json.dumps(param)); pprint(zx)

То вижу:

{'accesspass': '0', 'docdate': '2018-06-15 12:40:42', 'dognum': '3000001185', 'eorphone': 'mail@mail.ru', 'innk': '23422432870', 'ipaddress': '192.168.0.104', 'ipport': '5555', 'kassir':

donpadlo ()

Помидорами прошу не кидать, ТАК НУЖНО

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

Подними скрипт на питоне как сервер с API, сможешь дебажить как человек, а не заниматься копаниями. Достаточно взять любой HTTP клиент и проверить.

Т.е. явно не нравится русская кодировка

А ты уверен что у тебя всегда в sys.argv[1] - utf8 ?

Dred ★★★★★ ()
Ответ на: комментарий от Dred

А ты уверен что у тебя всегда в sys.argv[1] - utf8 ?

У него на входе же base64. Это всегда ASCII. utf8 там «для галочки».

В принципе если это чисто пример, то я бы просто обратное движение сделал бы тоже в base64 и не пыщпыщ себе мозг...

Scondo ()
Ответ на: комментарий от Scondo

Если предположить, что на выходе из base64.b64decode, получается ascii, то вот это должно было помочь (но не помогло)

st=sys.argv[1]; param=json.loads(base64.b64decode(st).decode('utf-8')) pprint(param)

Про

«я бы просто обратное движение сделал бы тоже в base64 и не пыщпыщ себе мозг...»

Не осознал что сделать..

donpadlo ()
Ответ на: комментарий от donpadlo

проведи полный тест. отправь из пыха в питон, верни обратно и выведи в окно браузера - получишь то, что будет получать скрипт в реальности. м.б. дело в консоли.

bvn13 ★★★★★ ()
Ответ на: комментарий от donpadlo

base64.b64decode на вход получает ASCII, потому что base64 - это подмножество ASCII То есть параметри .encode(«utf-8») вообще не нужен

«я бы просто обратное движение сделал бы тоже в base64 и не пыщпыщ себе мозг...»

Типа такого

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
param=json.loads(base64.b64decode(sys.argv[1]).decode("unicode_escape"))
params['kassir']=u'Петров П.П.' # Здесь настоящая обработка
jparams=json.dumps(params)
print(base64.b64enccode(jparams))
И в PHP добавить base64_decode

Scondo ()
Ответ на: комментарий от Scondo

А вот, добавив в скрипт на PHP 2>&1:

<?php $res=`/usr/bin/env python3 /var/www/noc/jobs/atol/libfptr10.py eyJtb2RlIjoicHJpbnRfZWwiLCJudW1jaGVjayI6IjY2NjA2MCIsImRvY2RhdGUiOiIyMDE4LTA2LTE1IDEyOjQwOjQyIiwic3VtbWRvYyI6IjE5NTAiLCJkb2dudW0iOiIzMDAwMDAxMTg1IiwiZW9ycGhvbmUiOiJtYWlsQG1haWwucnUiLCJpcGFkZHJlc3MiOiIxOTIuMTY4LjAuMTA0IiwiaXBwb3J0IjoiNTU1NSIsIm1vZGVsIjoiNjIiLCJhY2Nlc3NwYXNzIjoiMCIsInVzZXJwYXNzIjoiMzAiLCJwcm90b2NvbCI6IjIiLCJsb2dmaWxlbmFtZSI6IlwvdmFyXC9sb2dcL2trdC5sb2ciLCJ0ZXN0bW9kZSI6IjEiLCJsaWJwYXRoIjoiXC9ob21lXC9wYXZlbFwvcmVzZXJ2ZWRcL2dldGNvZGluZ1wvYXRvbFwvdGVzdFwvdmVyMTBcLyIsImthc3NpciI6Ilx1MDQxZlx1MDQ0M1x1MDQzZlx1MDQzYVx1MDQzOFx1MDQzZCBcdTA0MWYuXHUwNDE4LiIsImlubmsiOiIyMzQyMjQzMjg3MCJ9 2>&1`; echo $res;

Увидел ошибку:

Traceback (most recent call last): File «/var/www/noc/jobs/atol/libfptr10.py», line 1369, in pprint(param); File «/usr/lib/python3.6/pprint.py», line 53, in pprint printer.pprint(object) File «/usr/lib/python3.6/pprint.py», line 139, in pprint self._format(object, self._stream, 0, 0, {}, 0) File «/usr/lib/python3.6/pprint.py», line 167, in _format p(self, object, stream, indent, allowance, context, level + 1) File «/usr/lib/python3.6/pprint.py», line 189, in _pprint_dict context, level) File «/usr/lib/python3.6/pprint.py», line 346, in _format_dict_items context, level) File «/usr/lib/python3.6/pprint.py», line 176, in _format stream.write(rep) UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-6: ordinal not in range(128)

Уже лучше..

donpadlo ()

А почему нельзя из питона отдать прямо этот base64 и раскодировать его уже в PHP?

deadNightTiger ★★★★ ()
Ответ на: комментарий от donpadlo

Но мне структура нужна

А это не структура? Это вполне валидный json, просто все что могло поломаться заэскейплено - можно в браузере показать, можно PHP сказать распарсить этот json и работать с ним дальше, в общем все что угодно.

Когда делаю снова:

zx=json.loads(json.dumps(param)); pprint(zx)

Вы прикалываетесь что ли? Или не въезжаете вообще что тут происходит?

micronekodesu ★★ ()
Ответ на: комментарий от micronekodesu

Вы прикалываетесь что ли?

А из начального поста было непонятно? Чувак запускает питон из пыха потому что видите-ли для пыха нет готовых снипетов по работе с Атол. Поэтому мы не будем разбираться, а просто выдернем гланды через жопу (зато с примерами). В итоге даже это не получается...

no-such-file ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.