LINUX.ORG.RU

[CGI] Как задать переменную окружения?

 


0

1

Для выполнения CGI программы (Mapserver) нужно задать LD_LIBRARY_PATH. Пытался сделать так, создал .htaccess файл в cgi-bin директории со строкой SetEnv LD_LIBRARY_PATH /home/alexkrt/soft/lib, для проверки сделал питоновский скриптик:

#!/usr/bin/env python #                                                     
import os
print 'Content-Type: text/html'
print
print '<html>'
print '<head><title>Check ENV</title></head>'
print '<body>'
print '<h2>'
print os.getenv('LD_LIBRARY_PATH')
print '</h2>'
print '</body></html>'

Переменная не задается.

Также пытался изменить исходники мапсервера, добавил system(«export LD_LIBRARY_PATH=/home/alexkrt/soft/lib»); в main() mapserv.c, тоже не заработало. Но C совсем не знаю, поэтому не хочу разбираться в исходниках.

Что делаю не так? Какие есть еще варианты?

Root доступа нет, работаю на шаред хостинге

>#!/usr/bin/env python

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

Просто путь к питону прописать не пробовал?

anonymous
()

>добавил system(«export LD_LIBRARY_PATH=/home/alexkrt/soft/lib»); в main() mapserv.c, тоже не заработало

Тоже неудивительно. Оно вызывает отдельный шелл, который выполняет единственную команду (установку переменной). Никто, кроме него, этой переменной не увидит, так как окружение наследуется от родителя к потомку, но не наоборот.

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

Нормальный стандартный заголовок. Тем более, что PATH (и другие заданные переменные) он отлично читает, но изменить их не могу

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

>Нормальный стандартный заголовок.

...предписывающий запустить питон с пустым окружением.

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

#!/usr/bin/python

сделал такой заголовок, тоже не работает

alexkarta
() автор топика
Ответ на: комментарий от anonymous

PATH же показывает без проблем и другие переменные

alexkarta
() автор топика
Ответ на: комментарий от stevejobs

Так понял, что нужен доступ к конфигам апача. У меня его нет, только через .htaccess могу работать.

Есть еще один вариант. Создать скрипт над mapserv, который будет инициализировать переменную, передавать аргументы mapserv.

Можно ли такое сделать?

Посмотрел файл mapserv.c, так выглядит main int main(int argc, char *argv[]) {

Наверное, есть просто перенаправить аргументы, должен заработать, но правда надо еще вернуть stdout. Не особо представляю, как это сделать.

alexkarta
() автор топика

Вышеописанный скрипт должен работать. Какой результат выполнения?
Покажи error_log apache после выполнения запроса, а также содержимое .htaccess.

m0use
()

RE: [CGI] Как задать переменную окружения?

через промежуточный /bin/sh-скрипт (находящийся внутри ../cgi-bin/ )

....который сначало будет:

export LD_LIBRARY_PATH="...:$LD_LIBRARY_PATH"
а потом:

exec ... # к нужному реальному cgi-bin-файлу

:-)

сработает всегда и везде :-) .. хотя потеря в 10~30 милисекунд это конешно не хорошо :-(

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

>>#!/usr/bin/env python

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


хахаха :-) даже ЛОЛ-но что это забавляет вас!

однако _именно_ «#!/usr/bin/env python» наиболее правильный заголовок для python-скриптов

[и при этом такой-скрипт также как и все остальные программы — способен получать наследуемые переменные окружения.. а почему нет? :-)]

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

>Какой результат выполнения?

http://share.alexkarta.net/cgi-bin/hello.py т.е. переменная не задается

Покажи error_log apache после выполнения запроса

нет доступа к логу, в hello.py ошибок не возникает

также содержимое .htaccess

SetEnv LD_LIBRARY_PATH /home/alexkrt/soft/lib

alexkarta
() автор топика
Ответ на: комментарий от anonymous

> ..предписывающий запустить питон с пустым окружением.

лол какая чушь

redixin ★★★★
()
 
#!/usr/bin/env python # 
import os 
os.environ["LD_LIBRARY_PATH"] = "/home/megahacker/megalib.so"

print 'Content-Type: text/html' 
print print '<html>' 
print '<head><title>Check ENV</title></head>' 

как такой вариант?

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

Попытался еще добавить строку setenv(«LD_LIBRARY_PATH»,«/home/alexkrt/soft/lib»,1); в начало main() файла mapserv.c, т.к. думал, что из него собирается нужный мне mapserv, не сработало. Глянул Makefile и обнаружил такую строку:

mapserv: mapserv.h maptile.h $(LIBMAP_STATIC)  mapserv.o cgiutil.o maptile.o mapserver.h	$(LD) $(CFLAGS) mapserv.o cgiutil.o maptile.o $(EXE_LDFLAGS) -o mapserv

Не представляю, как сделать, чтобы setenv() вызывалась в самом начале работы mapserv

alexkarta
() автор топика
Ответ на: комментарий от redixin

Это мне ничего не даст, т.к. нужно, чтобы LD_LIBRARY_PATH задавалась перед вызовом mapserv, а он вызывается примерно так:

http://share.alexkarta.net/cgi-bin/mapserv?map=/PATH/TO/MAP/MYMAP.map&

Ели бы, конечно, он запускался так:

os.system("./mapserv")
то все бы сработало, но mapserv так не работает, разве что версию покажет

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

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

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

да через shell скрипт заработал, вчера сделал ошибку, только сегодня нашел (вместо /home написал home) спасибо

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