Perl and cgi tutorial

Установка переменных окружения

Чтобы установить временную (для сеанса) переменную окружения достаточно выполнить команду со следующим синтаксисом:

Если нужно временно модифицировать переменную PATH, то можно выполнить export:

Для того, чтобы удалить временную переменную можно воспользоваться командой unset:

Для установки системных или пользовательских переменных окружения следует помещать код с нужными переменными в соответствующие файлы инициализации окружения. Например, чтобы добавить на системном уровне какой-либо пользовательский каталог (пусть это будет

/bin), нужно один из файлов (/etc/profile или /etc/bash.bashrc) дополнить следующим кодом:

В случае, если нужно выполнить то же самое для пользовательского уровня переменных окружения, то редактировать нужно файл (для локального входа)

/.bashrc (для удалённого входа, например по SSH –

Этот код включит использование командным интерпретатором вышеупомянутой команды drush (предварительно установленной по указанному пути, конечно) для CMS Drupal.

Чтобы можно было видеть сделанные изменения, нужно их зафиксировать:

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Переменными окружения в операционных системах на базе ядра Linux называются те переменные, которые содержат текстовую информацию, используемую другими программами во время запуска. Обычно они включают общие системные параметры как графической, так и командной оболочки, данные о настройках пользователя, расположении определенных файлов и многое другое. Значения таких переменных указываются, например, цифрами, символами, путями к директориям или файлам. Благодаря этому множество приложений быстро получают доступ к определенным настройкам, а также появляется возможность для пользователя изменять или создавать новые опции.

Определение переменных окружения в Python

Переменная, чье значение присваивается Python извне, называют переменной окружения. Как правило, ее устанавливают в командной строке перед тем, как обратиться к исполняемому файлу Python. После этого ОС позволяет программе Python получать доступ к такой переменной.

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

Определение переменных окружения в Python

Алгоритм, по которому проходит установка переменных окружения, напрямую зависит от платформы. Поэтому следует использовать встроенный модуль OS компании Python для считывания переменных. Функции этого модуля позволяют взаимодействовать с операционной системой вне зависимости от ее платформы.

Для доступа к таким переменным в Python используется объект os.environ — это словарь, в котором хранятся все переменные окружения программы.

Имейте в виду, что объект os.environ фиксируется при загрузке модуля OS на Python. И если вы будете изменять переменные окружения после этого, то изменения не отобразятся os.environ (например, при экспорте новой переменной окружения в терминальный эмулятор).

Переменные среды специального назначения

Проблемы совместимости привели к появлению механизмов изменения поведения Apache при общении с конкретными клиентами. Чтобы сделать эти механизмы максимально гибкими, они вызываются путем определения переменных среды, как правило, с помощью , хотя, также можно использовать и PassEnv .

force-gzip

Если у вас активирован фильтр , эта переменная среды будет игнорировать настройку accept-encoding вашего браузера и отправит сжатый вывод безоговорочно.

force-no-vary

Это приводит к тому, что любые поля удаляются из заголовка ответа перед его отправкой обратно клиенту. Некоторые клиенты неправильно интерпретируют это поле; установка этой переменной может обойти эту проблему. Установка этой переменной также подразумевает force-response-1.0 .

force-response-1.0

Это заставляет HTTP/1.0 отвечать на запросы клиентов,делающих HTTP/1.0 запрос.Изначально это было реализовано в результате проблемы с прокси-серверами AOL.Некоторые клиенты HTTP/1.0 могут вести себя некорректно при получении ответа HTTP/1.1,и это может быть использовано для взаимодействия с ними.

gzip-only-text/html

При значении «1» эта переменная отключает выходной фильтр , предоставляемый для типов содержимого, отличных от . Если вы предпочитаете использовать статически сжатые файлы, также оценивает переменную (не только для gzip, но и для всех кодировок, которые отличаются от «identity»).

no-cache

Доступный в версиях 2.2.12 и позже

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

prefer-language

Это влияет на поведение . Если он содержит языковой тег (например, , или ), пытается доставить вариант с этим языком. Если такого варианта нет, применяется обычный процесс переговоров .

redirect-carefully

Это заставляет сервер быть более осторожным при отправке перенаправления клиенту.Обычно это используется,когда у клиента есть известные проблемы с обработкой перенаправления.Изначально это было реализовано в результате проблемы с программным обеспечением Microsoft WebFolders,которое имеет проблемы с обработкой перенаправлений на ресурсах каталогов с помощью методов DAV.

suppress-error-charset

Доступно в версиях после 2.0.54

Когда Apache выпускает перенаправление в ответ на запрос клиента,ответ включает в себя некоторый реальный текст,который должен быть отображен в случае,если клиент не может (или не может)автоматически следовать перенаправлению.Обычно Apache помечает этот текст в соответствии с используемым набором символов ISO-8859-1.

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

Установка этой переменной окружения заставляет Apache пропустить набор символов для текста перенаправления,и эти сломанные браузеры затем будут корректно использовать набор символов целевой страницы.

Примечание о безопасности

Отправка страниц с ошибками без указанного набора символов может позволить атаку с использованием кросс-скриптов для существующих браузеров (MSIE),которые не следуют спецификации HTTP/1.1 и пытаются «угадать» набор символов из содержимого.Такие браузеры могут быть легко обмануты с использованием набора символов UTF-7,а содержимое UTF-7 из входных данных (например,запрос-URI)не будет экранироваться обычными механизмами экранирования,предназначенными для предотвращения атак с использованием перекрестного скриптинга.

Setting up Cookies

This is very easy to send cookies to browser. These cookies will be sent along with HTTP Header. Assuming you want to set UserID and Password as cookies. So it will be done as follows −

#!/usr/bin/perl

print "Set-Cookie:UserID=XYZ;\n";
print "Set-Cookie:Password=XYZ123;\n";
print "Set-Cookie:Expires=Tuesday, 31-Dec-2007 23:12:40 GMT";\n";
print "Set-Cookie:Domain=www.tutorialspoint.com;\n";
print "Set-Cookie:Path=/perl;\n";
print "Content-type:text/html\r\n\r\n";
...........Rest of the HTML Content....

From this example you must have understood how to set cookies. We use Set-Cookie HTTP header to set cookies.

Here it is optional to set cookies attributes like Expires, Domain, and Path. It is notable that cookies are set before sending magic line «Content-type:text/html\r\n\r\n.

Первая программа CGI

Мы используем Python для создания первой программы CGI под названием hello.py, файл находится в папке / Var / WWW / CGI-BIN директории, следующим образом:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

print "Content-type:text/html"
print                               # 空行,告诉服务器结束头部
print '<html>'
print '<head>'
print '<meta charset="utf-8">'
print '<title>Hello Word - 我的第一个 CGI 程序!</title>'
print '</head>'
print '<body>'
print '<h2>Hello Word! 我是来自本教程的第一CGI程序</h2>'
print '</body>'
print '</html>'

После того, как вы сохраните изменения файла hello.py, изменять права доступа к файлам на 755:

chmod 755 hello.py 

Вышеприведенная программа отображается в браузере, чтобы получить доступ к результатам являются следующие:

Hello.py этот сценарий является простой скрипт Python, сценарий первого вывода строки «Content-Type: Текст / html» для отправки к типу браузера и сообщить браузеру для отображения содержимого как «текст / html».

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

Зачем нужны переменные окружения?

Если коротко, то они необходимы для организации различного рода окружений: системных, пользовательских, сеансовых, т. е. для хранения настроек соответствующих сред внутри системы. К примеру, программы для своей работы используют библиотечные функции, являющиеся одним из важнейших системных ресурсов. Или, например, интерпретатор команд способен находить соответствующие командам исполняемые файлы без необходимости каждый раз указывать соответствующие пути.

Но как программы «узнают», где можно найти те или иные ресурсы? Из переменных окружения. Таким же образом происходит запуск и исполнение команд в командной консоли, т. к. благодаря переменной окружения PATH интерпретатор bash (или любая другая командная оболочка) находит программу (исполняемый файл или библиотеку) по указанному в PATH пути. И таким же образом, к примеру, команда man «знает», что запрашиваемые страницы справочных руководств нужно искать согласно значению переменной окружения MANPATH.

Переменные среды и переменные оболочки

Обычно, переменные имеют такой формат:

Несколько основных правил для работы с переменными:

  • Имена переменных чувствительны к регистру. Все переменные среды должны называться С ЗАГЛАВНОЙ БУКВЫ.
  • Чтобы назначить несколько значений для одной переменной используйте знак «двоеточия» в качестве разделителя.
  • Символ «=» не должны окружать пробелы.

Переменные можно классифицировать на две основные категории: переменные среды и переменные оболочки:

  • Переменные среды — это такие переменные, которые доступны для всей системы и наследуются всеми дочерними процессами и оболочками.
  • Переменные оболочки(shell) — переменные, которые применяются только к текущему экземпляру оболочки. Каждая оболочка, такая как zsh и bash, имеет свой собственный набор внутренних переменных.

Есть несколько доступных команд, которые позволяют вам устанавливать и просматривать переменные среды в Linux:

  • env — Эта команда позволяет запускать другую программу в пользовательской среде без изменения текущей. Если использовать её без дополнительных аргументов, она выведет список текущих переменных среды.
  • printenv — Команда выведет на экран все или часть переменных.
  • set — Команда устанавливает или отменяет переменные оболочки. Если её использовать без аргумента, тогда она выведет список всех переменных, включая переменные окружения и оболочки, а также некоторые функции оболочки.
  • unset — Удаляет переменные оболочки и среды.
  • export — Устанавливает переменные среды.

Converting into Perl Content Handler

Now let’s convert this script into a content handler. There are two
parts to this task; the first one is to configure Apache to run the new
code as a Perl handler, the second one is to modify the code itself.

First we add the following snippet to httpd.conf:

  PerlModule Test::Cookie
  <Location /test/cookie>
    SetHandler perl-script
    PerlHandler Test::Cookie
  </Location>

After we restart the server, when there is a request whose URI starts
with /test/cookie, Apache will execute the
subroutine as a content handler. We made sure to preload the
module at server start-up, with the
directive.

Now we are going to modify the script itself. We copy the content to
the file Cookie.pm and place it into one of the directories listed
in . For example if /home/httpd/perl is a part of
and since we want to call this package , we can put
Cookie.pm into the /home/httpd/perl/Test/ directory.

So this is the new code. Notice that all the subroutines were left
unmodified from the original script, so to make the differences clear
we do not repeat them here.

  Test/Cookie.pm
  --------------
  package Test::Cookie;
  use Apache::Constants qw(:common);
  
  use strict;
  use CGI;
  use CGI::Cookie;
  use vars qw($q $switch $status $sessionID);
  
  sub handler{
    my $r = shift;
    Apache->request($r);
  
    init();
    print_header();
    print_status();
  
    return OK;
  }
  
  ### <-- subroutines --> ###
  # all subroutines as before
  
  1;

As you see there are two lines added to the beginning of the code:

  package Test::Cookie;
  use Apache::Constants qw(:common);

The first one declares the package name and the second one imports
some symbols commonly used in Perl handlers to return status codes.

  use strict;
  use CGI;
  use CGI::Cookie;
  use vars qw($q $switch $status $sessionID);

This code is left unchanged just as before.

  sub handler{
    my $r = shift;
    Apache->request($r);
  
    init();
    print_header();
    print_status();
  
    return OK;
  }

Each content handler (and any other handler) should begin with
a subroutine called handler(). This subroutine is called
when a request’s URI starts with /test/cookie as per our
configuration. Of course you can choose a different name, for example
execute(), but then you must explicitly use it in the configuration
directives in the following way:

  PerlModule Test::Cookie
  <Location /test/cookie>
    SetHandler perl-script
    PerlHandler Test::Cookie::execute
  </Location>

But we will use the default name, handler().

The handler() subroutine is just like any other subroutine, but
generally it has the following structure:

  sub handler{
    my $r = shift;
   
    # the code
  
    # status (OK, DECLINED or else)
    return OK;
  }

First we get the request object by shifting it from and
assigning it to the variable.

Second we write the code that does the processing of the request.

Third we return the status of the execution. There are many possible
statuses, the most commonly used are and , which tell the
server whether they have completed the request phase that the handler was
assigned to do or not. If not, another handler must
complete the processing. imports these two and
other some commonly used status codes.

So in our example all we had to do was to wrap the three calls:

    init();
    print_header();
    print_status();

inside:

  sub handler{
    my $r = shift;
    Apache->request($r);
  
    return OK;
  }

There is one line we didn’t discuss:

    Apache->request($r);

Since we use , it relies on the fact that was set in the
module. did that behind the scenes.
Since we don’t use here, we have to do that
ourselves.

The one last thing we should do is to add at the end of the
module, just like with any Perl module, so will not fail
when it tries to load .

So to summarize, we took the original script’s code and added the
following eight lines:

  package Test::Cookie;
  use Apache::Constants qw(:common);
  
  sub handler{
    my $r = shift;
    Apache->request($r);
  
    return OK;
  }
  1;

and now we have a fully fledged Perl Content Handler.

An Easy Break-in

You type in the username you want to peek at and a dummy password and
try to enter the account. On some services this will work!!!

  use vars ($authenticated);
  my $q = new CGI;
  my $username = $q->param('username');
  my $passwd   = $q->param('passwd');
  authenticate($username,$passwd);
    # failed, break out
  unless ($authenticated){
    print "Wrong passwd";
    exit;
  }
    # user is OK, fetch user's data
  show_user($username);
  
  sub authenticate{
    my ($username,$passwd) = @_;
    # some checking
    $authenticated = 1 if SOME_USER_PASSWD_CHECK_IS_OK;
  }

Do you see the catch? With the code above, I can type in any valid
username and any dummy password and enter that user’s account,
provided she has successfully entered her account before me using the
same child process! Since is global—if it becomes 1
once, it’ll stay 1 for the remainder of the child’s life!!! The
solution is trivial—reset to 0 at the beginning of
the program.

A cleaner solution of course is not to rely on global variables, but
rely on the return value from the function.

  my $q = CGI->new;
  my $username = $q->param('username');
  my $passwd   = $q->param('passwd');
  my $authenticated = authenticate($username,$passwd);
    # failed, break out
  unless ($authenticated){
    print "Wrong passwd";
    exit;
  }
    # user is OK, fetch user's data
  show_user($username);
  
  sub authenticate{
    my ($username,$passwd) = @_;
    # some checking
    return (SOME_USER_PASSWD_CHECK_IS_OK) ? 1 : 0;
  }

Of course this example is trivial—but believe me it happens!

Автоматизация работы в Web с помощью LWP

Ставили ли вы когда-нибудь перед собой задачу проверить Web-документ на предмет наличия «мертвых» ссылок, найти его название или выяснить, какие из его ссылок обновлялись с прошлого четверга? Может быть, вы хотели загрузить изображения, которые содержатся в каком-либо документе, или зеркально скопировать целый каталог? Что будет, если вам придется проходить через proxy-сервер или проводить переадресацию?

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

* Помните, что по Ларри Уоллу три главных достоинства программыста есть Леность, Нетерпение и Гордость.

Модули LWP (Library for WWW access in Perl — библиотека для доступа к WWW на Perl) из CPAN решают за вас все эти задачи — и даже больше. Например, обращение в сценарии к Web-документу с помощью этих модулей осуществляется настолько просто, что его можно выполнить с помощью одностроковой программы. Чтобы, к примеру, получить документ /perl/in-dex.html с узла www.perl.com, введите следующую строку в свой shell или интерпретатор команд:

perl -MLWP::Simple -e "getprint 'http://www.perl.com/perl/index.html'"

За исключением модуля LWP::Simple, большинство модулей комплекта LWP в значительной степени объектно-ориентированы. Вот, например, крошечная программа, которая получает URL как аргументы и выдает их названия:

#!/usr/local/bin/perl
use LWP;
$browser = LWP::UserAgent->new(); # создать виртуальный броузер 
$browser->agent("Mothra/126-Paladium:); # дать ему имя
foreeach $url (@ARGV) { # ожидать URL как аргументы

  # сделать GET-запрос по URL через виртуальный броузер
  $webdoc = $browser->request(HTTP::Request->new(GET => $url));

  if($webdoc->is success) { # нашли
    print STDOUT "$url::,$result->title, "\n";

  } else { # что-то не так
    print STDERR "$0: Couldn't fetch $url\n";

  }
}

Как видите, усилия, потраченные на изучение объектов Perl, не пропали даром. Но не забывайте, что, как и модуль CGI.pm, модули LWP скрывают большую часть сложной работы.

Этот сценарий работает так. Сначала создается объект — пользовательский агент (нечто вроде автоматизированного виртуального броузера). Этот объект используется для выдачи запросов на удаленные серверы. Дадим нашему виртуальному броузеру какое-нибудь глупое имя, просто чтобы сделать файлы регистрации пользователей более интересными. Затем получим удаленный документ, направив HTTP-запрос GET на удаленный сервер. Если результат успешный, выведем на экран URL и имя сервера; в противном случае немножко поплачем.

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

#!/usr/local/bin/perl -w
use strict;
use LWP 5.000;
use URI::URL;
use HTML::LinkExtor;

my($url, $browser, %saw);
$browser ” LPW::UserAgent->new(); # создать виртуальный броузер 
fоreach $url ( @ARGV ) { # выбрать документ через виртуальный броузер
  my $webdoc = $browser->request(HTTP: :Request->new(GET => $url).);
  next unless $webdoc->is_success;
  next unless $webdoc->content_type eq 'text/html';

  # не могу разобрать GIF-файлы
  my $base = $webdoc->base;

  # теперь извлечь все ссылки типа <А ...> и <IMG...>
  foreach (HTML::LinkExtor->new->parse($webdoc->content)->eof->links) { 
    my($tag, %links) = @$_;
    next unless $tag eq "a" or $tag eq "img";
    my $1ink;

    foreach $1ink (values %links) {
     $saw{ uri($1ink,$base)->abs->as_string }++;
    }
  }
}
print join("\n",sort keys %saw), "\n";

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


Назад | Вперед
Содержание (общее) | Содержание раздела

Passing Drop Down Box Data to CGI Program

Drop Down Box is used when we have many options available but only one or two will be selected.

Here is example HTML code for a form with one drop down box

<form action = "/cgi-bin/dropdown.cgi" method = "POST" target = "_blank">
   <select name = "dropdown">
      <option value = "Maths" selected>Maths</option>
      <option value = "Physics">Physics</option>
   </select>
   <input type = "submit" value = "Submit">
</form>

The result of this code is the following form −

Below is dropdown.cgi script to handle input given by web browser.

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;

if ($ENV{'REQUEST_METHOD'} eq "POST") {
   read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else {
   $buffer = $ENV{'QUERY_STRING'};
}

# Split information into name/value pairs
@pairs = split(/&/, $buffer);

foreach $pair (@pairs) {
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}

$subject = $FORM{dropdown};

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Dropdown Box - Sixth CGI Program</title>";
print "</head>";
print "<body>";
print "<h2> Selected Subject is $subject</h2>";
print "</body>";
print "</html>";

1;

CGI-модули/библиотеки

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

Если вы пишете CGI-программы на Perl, модули доступны на CPAN . Самый популярный модуль для этой цели . Вы могли бы также рассмотреть , который реализует минимальный набор функций, который является всем, что вам нужно в большинстве программ.

Если вы пишете CGI-программы на C, у вас есть множество вариантов. Одной из них является библиотека с https://web.mit.edu/wwwdev/www/cgic.html .

Заголовки браузера

Элемент Описание
$_SERVER Браузер и операционную система, открышие данную страницу (например, Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36)
$_SERVER Куки браузера в виде строки: ключ=значение; ключ=значение;…
Данные доступны в переменной $_COOKIE (_ym_uid=xxx; _ym_d=xxx; PHPSESSID=xxx;)
$_SERVER Адрес страницы, с которой браузер пользователя перешёл на текущую страницу (https://wm-school.ru/index.php)
$_SERVER Содержимое заголовка Accept из текущего запроса (text/html, application/xhtml+xml, application/xml;q=0.9, image/webp, image/apng, */*; q=0.8)
$_SERVER ​HTTP заголовок переданный клиентом, говорящий о том какие алгоритмы сжатия он может понять (gzip, deflate)
$_SERVER ​Содержимое заголовка Accept-Language (ru-RU,ru; q=0.9,en-US; q=0.8,en; q=0.7)
$_SERVER ​Предпочтения клиента относительно кодировки (utf-8, iso-8859-1)
$_SERVER ​max-age=0
$_SERVER ​Браузер отправляет этот заголовок со значением 1, выражающий предпочтение клиента для зашифрованного ответа

Виды переменных окружения

Как уже отмечалось, в системе существуют, образно выражаясь, различные рабочие среды для разных уровней доступа и продолжительности действия переменных. Для организации работы пользователей действует пользовательская среда (окружение), для корректного функционирования компонентов системы — системное окружение, доступное только суперпользователю. В процессе работы также можно устанавливать временные переменные окружения, доступные текущему пользователю и только на время действия текущего сеанса.

Ниже приведены некоторые наиболее часто используемые переменные окружения:

Имя Описание
HOME Определяет путь к домашнему каталогу текущего пользователя
PWD Определяет текущий активный каталог
OLDPWD Предыдущий активный каталог
SHELL Определяет программу-командную оболочку
TERM Содержит имя текущей запущенной программы-терминала
PAGER Определяет программу для постраничного вывода страниц справочных руководств
EDITOR Определяет программу для редактирования текстовых файлов
VISUAL Определяет программу для редактирования текстовых файлов с расширенными возможностями (vim, emacs)
MAIL Определяет путь к каталогу, в котором должны храниться файлы входящей электронной почты.
BROWSER Определяет веб-браузер, запускаемый по-умолчанию
ftp_proxy

http_proxy

Определяют, соответственно адреса для прокси-серверов по FTP и HTTP протоколам
MANPATH
Определяет каталог, в котором содержатся подкаталоги, содержащие man-страницы справочных руководств системной справки для команды man

INFODIR
Определяет список каталогов для поиска info-страниц для команды info

TZ
Определяет временную зону. Доступные временные зоны хранятся в /usr/share/zoneinfo

Системные переменные

Согласно стандартам Linux переменные окружения для организации системной среды хранятся в нескольких файлах:

  • /etc/bash.bashrc – хранение переменных для командных оболочек;
  • /etc/profile – хранение переменных для интерактивных оболочек;
  • /etc/environment – переменные из этого файла используются модулем

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

Пользовательские переменные

Для систем, ориентированных на многопользовательский доступ, например на хостинговых площадках, конкретному пользователю полезно иметь возможность гибко настраивать своё собственное рабочее окружение, создавая новые переменные или дополняя их новыми значениями. К примеру, владельцу сайта, для его виртуального хоста, обслуживающего сайт на CMS Drupal, захотелось установить утилиту drush, которая облегчает и ускоряет обслуживание CMS. В этом случае достаточно после локальной установки (в каком-нибудь подкаталоге домашнего каталога) drush, дополнить переменную PATH значением, содержащим путь к утилите drush в файле

/.bashrc. В результате командная оболочка сможет запускать команду drush для данного пользователя.

По стандартам соглашений для Linux-систем конфигурация для пользовательского окружения должна храниться в следующих файлах:

/.bashrc – для хранения параметров инициализации выбранной командной оболочки для пользователя;

/.profile – для инициализации доступных пользователю командных оболочек;

/.pam_environment – для использования модулем

Временные или переменные сеанса

Переменные окружения также можно устанавливать временно. Это значит, что переменная будет действовать только во время действия текущего сеанса пользователя. В таких случаях удобно иметь определённый скрипт, содержащий код с необходимыми переменными, который можно в любое время запускать командой:

Или же устанавливать их вручную командой export.

заголовок HTTP

содержание test.cgi файлов в: часть заголовка HTTP является «Content-Type текст / html», он будет направлен к типу контента браузер сообщает файлы браузера.

Формат заголовка HTTP, выглядит следующим образом:

HTTP 字段名: 字段内容

Например:

Content-type:text/html\r\n\r\n

В следующей таблице приведены сведения в программах CGI заголовка HTTP часто используются:

руководитель описание
Content-Type: MIME-объект, соответствующий запросу информации. Например: Content-Type: Текст / html
Истекает: Дата дата и время отклика истекло
Расположение: URL Чтобы перенаправить получателя на запрос, не расположение URL для выполнения запроса или идентификации новых ресурсов
Последнего изменения: Дата Запрошенный ресурс Последнее изменение
Content-Length: N Запрос Content-Length
Set-Cookie: String Настройки Http Cookie

Установка переменных среды

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

Создадим новую переменную оболочки с именем MY_VAR и значением Abuzov, для этого введём:

Вы можете проверить, что переменная установлена, используя echo $MY_VAR. Для фильтрации вывода команды set с помощью grep set | grep MY_VAR:

Используйте команду printenv, чтобы проверить, является ли эта переменная переменной среды:

Вывод окажется пустым — это говорит о том, что переменная не является переменной окружения. Также можно напечатать переменную в под-оболочке, и вы получите пустой вывод.

Команда export используется для установки переменных окружения. Чтобы создать переменную, просто экспортируйте переменную оболочки как переменную среды:

Теперь выполнение команды printenv MY_VAR выведет на экран значение Abuzov. Дополнительно, можно устанавливать переменные среды командой в одну строку:

Переменные среды, созданные таким образом, доступны только в текущем сеансе. Если вы откроете новую оболочку или выйдете из системы, все переменные будут потеряны.

How To Raise a «File Download» Dialog Box ?

Sometime it is desired that you want to give option where a use will click a link and it will pop up a «File Download» dialogue box to the user in stead of displaying actual content. This is very easy and will be achived through HTTP header.

This HTTP header will be different from the header mentioned in previous section.

For example,if you want make a FileName file downloadable from a given link then its syntax will be as follows.

#!/usr/bin/perl

# HTTP Header
print "Content-Type:application/octet-stream; name=\"FileName\"\r\n";
print "Content-Disposition: attachment; filename=\"FileName\"\r\n\n";

# Actual File Content will go hear.
open( FILE, "<FileName" );
while(read(FILE, $buffer, 100) ) {
   print("$buffer");
}
Рейтинг
( Пока оценок нет )
Editor
Editor/ автор статьи

Давно интересуюсь темой. Мне нравится писать о том, в чём разбираюсь.

Понравилась статья? Поделиться с друзьями:
Люкс-хост
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: