URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 77077
[ Назад ]

Исходное сообщение
"Запуск httpd из шелл под root'ом и из автозагрузки дают разные права.."

Отправлено Petja , 30-Окт-07 11:06 
Проблема в том, что у меня в /etc/profile прописано много локалей, необходимых для работы переводчика. Так вот. При логине в шелле под root или www (для обоих пользователей у меня прописаны все права и шелл bash), все прописанные локали поддершиваются. Если я из под шелл запускаю apache: apachectl stop; apachectl start, то локали поддерживаются и для функции exec или system (PHP). Если я перезагружаю apache (apachectl restart) или apache загружается из автозагрузки, то локали перестают работать из под exec или system. Для всех скриптов (автозагрузка, apachectl) прописал вместо #!/bin/sh - #!/usr/local/bin/bash
Всеравно не помогает... Подскажите, плз - как заставить чтобы шелл запущенный через web - также поддерживал необходимые env переменные?

Содержание

Сообщения в этом обсуждении
"Запуск httpd из шелл под root'ом и из автозагрузки дают разн..."
Отправлено newser , 30-Окт-07 11:51 
>[оверквотинг удален]
>для работы переводчика. Так вот. При логине в шелле под root
>или www (для обоих пользователей у меня прописаны все права и
>шелл bash), все прописанные локали поддершиваются. Если я из под шелл
>запускаю apache: apachectl stop; apachectl start, то локали поддерживаются и для
>функции exec или system (PHP). Если я перезагружаю apache (apachectl restart)
>или apache загружается из автозагрузки, то локали перестают работать из под
>exec или system. Для всех скриптов (автозагрузка, apachectl) прописал вместо #!/bin/sh
>- #!/usr/local/bin/bash
>Всеравно не помогает... Подскажите, плз - как заставить чтобы шелл запущенный через
>web - также поддерживал необходимые env переменные?

Вы в httpd.conf прописывать переменные окружения не пробовали?


"Запуск httpd из шелл под root'ом и из автозагрузки дают разн..."
Отправлено Petja , 30-Окт-07 19:42 
>[оверквотинг удален]
>>шелл bash), все прописанные локали поддершиваются. Если я из под шелл
>>запускаю apache: apachectl stop; apachectl start, то локали поддерживаются и для
>>функции exec или system (PHP). Если я перезагружаю apache (apachectl restart)
>>или apache загружается из автозагрузки, то локали перестают работать из под
>>exec или system. Для всех скриптов (автозагрузка, apachectl) прописал вместо #!/bin/sh
>>- #!/usr/local/bin/bash
>>Всеравно не помогает... Подскажите, плз - как заставить чтобы шелл запущенный через
>>web - также поддерживал необходимые env переменные?
>
>Вы в httpd.conf прописывать переменные окружения не пробовали?

Спасибо! Наконец-то заработало, я щщаслив, спасибо! :-)


"Запуск httpd из шелл под root'ом и из автозагрузки дают разн..."
Отправлено Petja , 30-Окт-07 22:14 
>[оверквотинг удален]
>>>функции exec или system (PHP). Если я перезагружаю apache (apachectl restart)
>>>или apache загружается из автозагрузки, то локали перестают работать из под
>>>exec или system. Для всех скриптов (автозагрузка, apachectl) прописал вместо #!/bin/sh
>>>- #!/usr/local/bin/bash
>>>Всеравно не помогает... Подскажите, плз - как заставить чтобы шелл запущенный через
>>>web - также поддерживал необходимые env переменные?
>>
>>Вы в httpd.conf прописывать переменные окружения не пробовали?
>
>Спасибо! Наконец-то заработало, я щщаслив, спасибо! :-)

Неа, показалось, всеравно не работает!
Завтра такуюже новую тему открою :-(


"Запуск httpd из шелл под root'ом и из автозагрузки дают разн..."
Отправлено angra , 30-Окт-07 15:27 
Зачем такой изврат? Установкой Env из под апача конечно можно добится того что вам надо, но зачем? Сдается мне вы двигаетесь в очень неправильном направлении, может еще не поздно остановится и сделать все по уму?

"Запуск httpd из шелл под root'ом и из автозагрузки дают разн..."
Отправлено Petja , 30-Окт-07 16:35 
>Зачем такой изврат? Установкой Env из под апача конечно можно добится того
>что вам надо, но зачем? Сдается мне вы двигаетесь в очень
>неправильном направлении, может еще не поздно остановится и сделать все по
>уму?

Вот я собственно и спрашиваю - как по уму сделать?


"Запуск httpd из шелл под root'ом и из автозагрузки дают разн..."
Отправлено konst , 30-Окт-07 22:51 
>>Зачем такой изврат? Установкой Env из под апача конечно можно добится того
>>что вам надо, но зачем? Сдается мне вы двигаетесь в очень
>>неправильном направлении, может еще не поздно остановится и сделать все по
>>уму?
>
>Вот я собственно и спрашиваю - как по уму сделать?

В php/perl скриптах можно устанавлмвать локаль. В perl - setlocale. В php - не помню..


"Запуск httpd из шелл под root'ом и из автозагрузки дают разн..."
Отправлено Petja , 31-Окт-07 13:45 
>>>Зачем такой изврат? Установкой Env из под апача конечно можно добится того
>>>что вам надо, но зачем? Сдается мне вы двигаетесь в очень
>>>неправильном направлении, может еще не поздно остановится и сделать все по
>>>уму?
>>
>>Вот я собственно и спрашиваю - как по уму сделать?
>
>В php/perl скриптах можно устанавлмвать локаль. В perl - setlocale. В php
>- не помню..

Дело в том, что у меня много локалей - и эти локали нужны не для php, а для того чтобы шелл понимал язык.


"Запуск httpd из шелл под root'ом и из автозагрузки дают разн..."
Отправлено angra , 31-Окт-07 02:36 
>Вот я собственно и спрашиваю - как по уму сделать?

Тогда сформулируйте изначальную задачу. То есть для какой цели вы хотите менять локаль, что вы берете из локали, почему без смены локали скрипты не работают.



"Запуск httpd из шелл под root'ом и из автозагрузки дают разн..."
Отправлено Petja , 31-Окт-07 13:44 
>>Вот я собственно и спрашиваю - как по уму сделать?
>
>Тогда сформулируйте изначальную задачу. То есть для какой цели вы хотите менять
>локаль, что вы берете из локали, почему без смены локали скрипты
>не работают.

У меня установлен шелл переаодчик
Он берет из скрипта php (из формы) текст (иероглифы, русские буквы, испанские).
Далее через exec - передает текст в коммандную строку - если шелл локаль не видит - то получаются знаки вопросов, т.е. в переводчик передается все правильно - он понимает utf-8, а при выходе (уже переведенный текст) в знаках вопросов - т.е. он тоже из шелл забирается - а шелл не понимает какая локаль.
Так вот понимает локаль - в первом случае - если я из под рута запускаю апач и не понимает, если апач сам запускается - из автозагрузки.
С юзерами я в первом посте все подробно описал...


"Запуск httpd из шелл под root'ом и из автозагрузки дают разн..."
Отправлено angra , 31-Окт-07 15:49 
отдавайте команду предварив ее export LC_ALL="ваша локаль". Например
exec('export LC_ALL=ru_RU.CP1251; mytranslator ...')
Также вы можете попробовать менять хеш среды. %ENV в перле, в php не помню, посмотрите доку на тему super globals. И наконец зная в какой кодировке идет возврат мы можете просто перекодировать вывод в самом php(при конвертации юникод-однобайтные могут быть проблемы, но если у вас юникод, то нафига все остальные кодировки)


"Запуск httpd из шелл под root'ом и из автозагрузки дают разн..."
Отправлено Petja , 31-Окт-07 17:14 
>в какой кодировке идет возврат мы можете просто перекодировать вывод в
>самом php

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

>(при конвертации юникод-однобайтные могут быть проблемы, но если у вас
>юникод, то нафига все остальные кодировки)

Юникод, я его поэтому и взял - но даже юникод не поддерживается шеллом.
Пробовал локали прописывать перед коммандой. Это соувсем не то, проблема в самом экземпляре шелла - который вызывается екзеком и ничего не понимает...


"Запуск httpd из шелл под root'ом и из автозагрузки дают разн..."
Отправлено Petja , 31-Окт-07 17:16 
>[оверквотинг удален]
>так что в самом PHP не получится из вопросов что-либо получить.
>
>
>>(при конвертации юникод-однобайтные могут быть проблемы, но если у вас
>>юникод, то нафига все остальные кодировки)
>
>Юникод, я его поэтому и взял - но даже юникод не поддерживается
>шеллом.
>Пробовал локали прописывать перед коммандой. Это соувсем не то, проблема в самом
>экземпляре шелла - который вызывается екзеком и ничего не понимает...

Точнее пробовал прописывать как вы сказали: exec('export LC_ALL=ru_RU.CP1251; mytranslator ...') - не помогает.


"Запуск httpd из шелл под root'ом и из автозагрузки дают разн..."
Отправлено angra , 01-Ноя-07 07:58 
>Точнее пробовал прописывать как вы сказали: exec('export LC_ALL=ru_RU.CP1251; mytranslator ...') - не помогает.

надеюсь вы не буквально так написали, а адаптировали под ваши нужды. export LC_ALL= повзоляет выставить локаль для всех команд запущенных в том же экземпляре шелла, а ; является разделителем комманд в шелле. То есть перводчик должен был получить правильную установку локали.

Давно не работал с php и не помню уже как работает в нем system/exec и как у него вообще с поддержкой unicode. Как вариант можно попробовать
1. перенаправлять вывод переводчика в файл, а потом его читать средствами php
2. перенаправлять вывод переводчика в iconv и указывать из какой кодировки в какую сконвертить