Техническая поддержка

Персональные CGI - Ваши скрипты на Perl и других языках

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

Cgi могут быть в виде скриптов на perl5 или выполняемых программ для архитектуры i386 и операционной системы FreeBSD.

Учтите, что скрипт работает под Вашими правами, поэтому неправильно написанный cgi-скрипт может привести к уничтожению или замене содержимого Вашего сервера. Мы не несем никакой ответственности за ошибки в написанных Вами cgi-скриптах.

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

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

Адекватно работающие скрипты, правильно написанные и соблюдающию идеологию WWW, не испытывают никаких проблем, и никогда не достигают установленных ограничений.

В соответствии с идеологией WWW, cgi скрипты не должны делать активных вычислений и прочей трудоемкой работы во время выдачи ответа конечному пользователю. Постарайтесь, чтобы скрипты отрабатывались быстро. Всю сложную работу лучше выполнять отдельно, запуская из shell различного рода обработчики и индексаторы. В противном случае нетерпеливый клиент может в десятки раз увеличить загрузку машины быстро нажимая "reload".

Будьте бдительны, не допускайте явных ошибок. Тщательно верифицируйте получаемые данные. Учтите, что хакер постарается ввести не те данные, которые вы ждете, а те, которые ему могут помочь получить доступ к Вашему серверу. Никогда не используйте полученные данные как имя файла или каталога. Проверяйте конструкции типа [file="../../../index.html"]

Скрипты должны лежать в подкаталоге vcgi в Вашей домашней директории. Права на скрипт должны быть rwxr-x--- (750), т.е. это исполняемый файл, доступный на запись только для его владельца.

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

Обращаться к своим скриптам нужно по схеме /cgi-bin/your-cgi.pl

В ряде скриптов необходимо указывать директорию в которой лежат рабочие файлы. Указывайте пути относительно vcgi директории. Именно она является текущей при выполнении скрипта. Пример:

#D1E5FCasedir="../data";

Русский язык, кодировка

Расширение скрипта должно быть .pl. В этом случае перекодирующий сервер правильно выдаст charset.

Для неперекодирующего сервера нужно самостоятельно поставить charset: windows-1251

Образец скрипта:

#!/usr/local/bin/perl

print "Content-type: text/html";
if ( (!($ENV{"SERVER_SOFTWARE"} =~ /rus/))) { 
   print ";charset=windows-1251"; 
}
print "\n\n";

print "<HTML>";

while (($key,$val)  = each %ENV) {
   print "$key = $val<br>";
}

Сохраните этот текст в файл, положите в свою cgi директорию, поставьте правильные права ( chmod 750 file) и попробуйте его в работе.

Где лежит perl?

#!/usr/local/bin/perl - perl5

в директории /usr/local/perl/lib лежат модули для perl5.

Как правильно загружать скрипты на сервер?

Скрипты на языке Perl представляют из себя текстовые файлы. Если для загрузки скриптов Вы пользуетесь FTP-клиентом, необходимо контролировать режим, в котором на сервер загружаются такие данные. Текстовые файлы нужно загружать в текстовом (ASCII) режиме. Еще бывает двоичный (BINARY) режим работы FTP. Скрипты, загруженные в двоичном режиме, работать не будут.

Где находится sendmail и как правильно его вызывать?

Sendmail находится здесь:

/usr/sbin/sendmail

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

По стандарту поле Return-path в каждом почтовом сообщении помогает почтовым серверам определять, кто же на самом деле является отправителем сообщения. Уведомления об ошибках отправляются именно на адрес, указанный в поле Return-path. Опция -f позволяет явно указать что за адрес в результате окажется в заголовке созданного письма в поле Return-path. Поле From Вы, как обычно, создаете прямо в скрипте.

Пример программы на языке perl :

#!/usr/local/bin/perl

open MAIL,"|/usr/sbin/sendmail -f devnull\@aha.ru -t" || die "Cannot open sendmail - $|";
print MAIL "From: test\@aha.ru\nTo: devnull\@aha.ru\nSubject: test\n\nThis is a body";
close MAIL;

Отладка CGI скриптов

Зайдите в unix shell. Сделайте shell скрипт примерно такого содержания:

#!/bin/sh
QUERY_STRING="все что бывает после ?"; export QUERY_STRING
PATH_INFO="все что бывает после /"; export PATH_INFO
HTTP_USER_AGENT="Mozilla"; export HTTP_USER_AGENT
#any other vars used in script ; export it
cd vcgi
/usr/local/bin/perl -d your.script.pl < ~/file_with_POST_data

-d запускает perl debugger. Если он не нужен, уберите этот ключ.
Если Вам не нужно проверять POST, то < ~/file_with_POST_data можно опустить.

Вообще, старайтесь проверять скрипты перед тем, как помещать на веб-сервер. Если в скрипте есть ошибки, то, запустив скрипт в unix shell, Вы сможете увидеть что конкретно "не нравится" интерпретатору perl. Если скрипт работает в shell, но не работает при запуске через web, выдавая 'internal server error 500', посмотрите в файл error_log, который есть в Вашем домашнем каталоге. Стоит отметить, что файл этот будет появляться только в том случае, если Вы включили соответствующую опцию в Панели управления. Web-сервер пишет в error_log сообщения об ошибках, которые возникают при его работе.