Переменная среды для сценариев Perl CGI - PullRequest
1 голос
/ 16 декабря 2010

У меня есть сценарий cgi, подобный следующему:

BEGIN {
    unshift (@INC, "$ENV{'HOME'}/www/cgi-bin/SiteSpecific");
}

print "Content-type: text/html\n\n";
use SiteObject;
my $siteObjInst = SiteObject->instance();
print $siteObjInst->{HideFields};

Это будет нормально работать из командной строки, но не будет работать при запуске в качестве сценария CGI из браузера.$ ENV {'HOME'}, возможно, не задан, так как сценарий не может найти модуль.

Неужели сценарии CGI не запускаются внутри оболочки и не находят переменные среды?

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

Спасибо за вашу помощь.

Ответы [ 3 ]

4 голосов
/ 16 декабря 2010

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

Вы можете напечатать значение $ ENV {HOME} из программы CGI или, что еще лучше, распечатать весь хеш% ENV, чтобы увидеть, что на самом деле происходит.

По моему опыту, лучше либо жестко закодировать полный путьк дополнительным библиотекам или задайте путь извне (например, используя PERL5LIB).Если вы устанавливаете его изнутри программы, используйте прагму lib, а не изменяйте @INC напрямую:

use lib '/home/user/www/cgi-bin/siteSpecific';
1 голос
/ 16 декабря 2010

Список некоторых проблем и возможных ответов я бы начал с Как я могу устранить неполадки моего скрипта Perl CGI? .

1 голос
/ 16 декабря 2010

Вы определенно не можете гарантировать, что ваша оболочка и идентификатор, на котором работает веб-сервер, имеют одинаковую переменную для $ENV{HOME}. Забудьте весь этот код на некоторое время и попробуйте это:

print "Content-type: text/html\n\n";
print  q[<html><head><title>A Page</title></head>]
    . qq[<body><h1>\$HOME=$ENV{HOME}</h1></body></html>]
    ;

Или даже это:

use strict;
use warnings;
use CGI;

my $q = CGI->new;
print $q->header
    , $q->start_html( 'A Page' )
    , $q->start_table
    , $q->Tr( $q->th( 'Name' ), $q->th( 'Value' ))
    , ( map { $q->Tr( $q->td( $_ ), $q->td( $ENV{$_} )) } sort keys %ENV )
    , $q->end_table
    , $q->end_html
    ;
...