Иллюстрированный самоучитель по Linux Red Hat 7.1

         

Конфигурирование главного сервера


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

Port

Команда Port - второй важный элемент. Подразумевается, что по умолчанию Web-сервер работает с 80-м портом. Когда браузер запрашивает URL без порта, он подразумевает, что URL запрашивается с сервера через порт 80. Если вы используете брандмауер с высоким или средним уровнем защиты, удостоверьтесь в том, что он настроен на разрешение приема WWW-данных, как описано в гл. 31.

Из-за уязвимости процессов, работающих с номерами портов меньше 1024, можно попробовать запустить сервер чеоет порт с номером выше 1024 (если запускается Web-сервер с ограниченным

доступом по сети Internet и необходимо избежать риска, связанного с номерами портов меньше 1024). Обычно для таких Web-серверов используются порты 8000 и 8080, но можно выбрать любой свободный порт. Если вы используете брандмауер с высоким уровнем защиты, удостоверьтесь в том, что он настроен на разрешение приема WWW-данных для выбранного порта. Настраивая свой брандмауер с помощью утилиты lokkit, описанной в главе Chapter 31, при использовании порта 8080, введите 8080 :udp, 8080: top в поле Other Ports (Другие порты) в разделе Customization (Настройка).

User И Group

Команды User и Group - критические элементы, так как они оказывают существенное влияние на безопасность системы. Обычно httpd запускается как root, но этот процесс не прослушивает соединения. Чаще этот процесс запускает один или несколько дочернюифоцессов user и group (указанные именем либо ID-номером), определенных этими командами конфигурации.

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


Обычно Web- сервер запускают под именем apache группой apache или #-1. Автор книги чаще всего использует имя apache и группу apache, так как их легко илентифицировать при чтении файла конфигурации. Это имя (apache) имеет ограниченные привилегии в системе и потенциальный хакер может нанести ограниченный вред, если сценарий CGI позволит ему прорваться в систему.



ServerAdmin

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



ServerName

Команда ServerName устанавливает имя хоста, возвращаемое клиентам с запрашиваемыми страницами. Это должно быть одно из допустимых имен сервера в соответствии с DNS-записью или таблицей хостов сети. В среде Intranet имя хоста можно определить в таблицах хостов, используя NIS, либо на сервере DNS вашего сайта. Для Web-сервера Intranet нужно убедиться, что указанное в этой команде имя допустимо в DNS-записи вашего домена. Если уверенности в этом нет, уточните у администратора записей имен доменов.

В этом примере для ServerName задано значение localhost. Если у вас есть свой домен, вы можете изменить это имя на имя Интернет-домена, например, mommabears. com.



DocumentRoot



Команда DocumentRoot указывает местоположение корневого каталога для файлов HTML. Для Red Hat Linux 7.1 по умолчанию это каталог /var/www/html. Если для ServerName задано значение mommabears. com, клиент с браузером должен иметь возможность получить доступ к файлу /var/www/html /file, html, используя URL-адрес http: //www.mommabears.com/ file.html.



Разрешение каталога HTML

Приведенный далее код является разделом примера файла httpd. conf, имеющего отношение к корневому каталогу F-HTML-документов. Комментарии удалены.



<Directory /var/www/html>

Options Indexes Includes FollowSymLinks

AllowOverride None

order allow,deny

allow from all

</Directory>

Структура этого элемента такова, что необходимые команды помещаются между открывающим и закрывающим дескрипторами <Directory> и </Directory> соответственно. Открывающий дескриптор указывает каталог, на который распространяются все команды, находящиеся между дескрипторами, в данном случае /var/www/html.

Обратите внимание: между дескрипторами <Directory> и </Directory> находятся четыре команды.

Команда Options указывает, какие специальные действия можно выполнить с файлами, находящимися в каталоге и его подкаталогах. Возможны значения None, All, Indexes, Includes, FollowSymLinks, ExecCGI и MultiViews. Для HTML каталогов обычно используются значения None, когда на сайте находятся только обычные файлы HTML и рисунки, и Includes, если планируется разрешить серверу обработку HTML. (Некоторые обрабатываемые сервером файлы HTML позволяют включать другие файлы в содержимое HTML-файла, и эта опция разрешает такое действие).

Следующая команда, AllowOverride, указывает, как влияет локальный файл . htaccess на переопределение элементов файла глобального доступа httpd. conf. Возможны значения None, All, Options, FileInfo, AuthConfig и Limit. Например, величина Options ограничивает возможности файла .htaccess переопределением команды Options. На тех серверах, где Web-мастер полностью контролирует содержимое, проще всего санкционировать файлу httpd. conf полное право переопределения. Если имеется сервер с несколькими пользователями, которые контролируют состав своих собственных каталогов, будет разумно ограничить их привилегии по переопределению конфигурации глобального доступа.

Команды order и allow используются вместе для определения тех, кто имеет доступ к страницам каталога. Приведенная в примере команда order al low, deny указывает, что сначала следует использовать команду allow и, если она не позволяет пользователю получить требуемый файл, то тогда применяется команда deny.



Обычно приходится использовать order allow, deny, если не применяется управление доступом. Если необходимо решшзовать управление доступом, то order deny, allow является лучшей командой (это станет понятно позже при построении небольшого Web-сайта с контролем доступа).

После команды order находится команда allow, которая указывает, что всем пользователем разрешается доступ. Чтобы узнать, как запретить доступ пользователей, прочтите документацию по Apache (http: / /httpd. apache. org).



UserDir

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

Обычно используется public_html. Поэтому если у пользователя testuser есть каталог /home/ testuser/public_html, то к этому каталогу можно получить доступ через Web, используя URL

http://servername/


~testuser.



Directory-Index

Directory Index указывает, какие файлы должны приниматься как индексные. Это позволяет для такого URL, как http: / /www. mommabears. com получить доступ к нужному файлу.

В примере httpd.conf имеется семь элементов в Directorylndex: index.html, index.htm, index.shtml, index.php, index.php4, index.php3 и index.cgi. Это означает, что для любого URL, в котором не указано имя файла, а только имя каталога, сервер сначала попробует вернуть файл index. html из указанного каталога. Если такого файла нет, будет передан файл index. htm; если этого файла нет, то клиенту будет передан файл index. shtml и т.д. - вплоть до последнего седьмого.

Если ни один файл не найден, то сервер возвращает листинг каталога либо сообщение об ошибке, в зависимости от других настроек конфигурации.



AccessFileName

AccessFileName используется для указания имени файла, содержащего информацию управления доступом для данного каталога. Можно хранить информацию управления доступом в конфигурационном файле httpd. conf или в файлах . htaccess в каждом каталоге.



В примере указано, что если в каталоге есть файл . htaccess, то он содержит информацию управления доступом для каталога.



ScriptAlias

Очень важно корректно использовать команду ScriptAlias, чтобы указать каталог размещения программ CGI и сценариев. ScriptAlias указывает, какой каталог используется для сценариев CGI, и какой URL соответствует этому каталогу. Это единственное место, куда можно поместить программы CG1, пока не будут назначены другие условия для запуска CGl-программ по расширениям (как это выполнено далее посредством команды AddHandler).

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

ScriptAlias /cgi-bin/ "/var/www/cgi-bin"

Эта строка показывает, что URL http: //www.moramabears.com/cgi-bin/ соответствует /var/www/cgi-bin/. Подразумевается, что все файлы в этом каталоге являются сценариями CGI и сервер пытается запустить их, вместо того, чтобы возвратить их запрашиваемому клиенту.



Разрешение каталога CGI

По сравнению с описанием HTML-каталога, приведенным ранее, описание CGI-каталога выглядит несколько иначе:

<Directory /var/www/cgi-bin>

AllowOverride None Options ExecCGI Order allow,deny Allow from all

</Directory>

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



AddHandler и AddType

Команды AddHandler и AddType нужно рассматривать вместе.

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

AddType создает новый тип MIME для указанного расширения. Типы MIME важны для указания клиенту, как нужно обращаться с файлом. Например, если в браузер передается файл с типом MIME text /plain, то браузер не интерпретирует код HTML в этом файле, в то время как тип MIME text /html заставляет браузер обрабатывать принимаемый файл как файл HTML.



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



Разрешение сценариев CGI

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

AddHandler cgi-script .cgi

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

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



Разрешение обработки HTML для сервера

Для этого используются обе команды - AddHandler и AddType- Для Apache обычно указывается:

AddType text/html .shtml AddHandler server-parsed .shtml

Здесь AddType гарантирует, что результат обработки сервером файла HTML (эти файлы имеют расширение . shtml) рассматривается браузером клиента как файл HTML и отображается соответственно.

Строка AddHandler указывает, что файлы с расширением . shtml обрабатываются сервером. Это эффективно разрешает обработку сервером HTML для файлов . shtml.


Не останавливайтесь на достигнутом


Изложенные принципы помогут вам организовать работу с дистрибутивом Linux Router Project для создания (кроме всего прочего) более совершенных маршрутизаторов, способных поддерживать соединения ISDN, пользователей коммутируемого соединения РРР и TnLernet-соединения по выделенной линии. Для этого потребуются дополнительные комбинации модулей и особые конфигурации систем. Необходимую информацию можно получить на Web сайте

http://www.linuxrouter.org

.



Перезагрузка системы


Программа установки предложит удалить все дискеты из дисководов и перезагрузить систему. Некоторые дистрибутивы Linux автоматически выбрасывают установочный CD-ROM. Если он остался в накопителе, извлеките его сами перед перезагрузкой. Если Linux указан как операционная система, загружаемая по умолчанию, то будет загружен именно он. В течение 5-секундной паузы, предоставляемой загрузчиком, можно указать загрузку другой системы.

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

[armand@localhdst armand]$

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

exit

и нажмите Enter.

Linux допускает многократный вход в систему - даже в первоначальном текстовом режиме. С помощью клавиш Alt+Fl - Alt+F6, можно переключаться с одной виртуальной консоли на другую, используя одновременно до шести консолей. Для использования каждой виртуальной консоли нужен отдельный вход в систему. Вход на все консоли можно выполнять по одной учетной записи пользователя либо по разным записям. Это одна из особенностей Unix и Linux, обеспечивающих чрезвычайно гибкую рабочую среду.



Разбивка диска


Чтобы установить Linux, не уничтожая существующую операционнчто систему при отсутствии свободных жестких дисков или разделов, надо найти на жестком диске свободное место и отрегулировать его разбивку так, чтобы освободить раздел для установки. Как правило, для полной установки Linux требуется минимум 2 Гбайт, обязательно в одном разделе. В Windows каждый раздел представляется как отдельный диск (С, D, Е и т.д.), так что надо найти диск с как минимум 2 Гбайт свободного места.



Ротация журналов


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

Простейшая стратегия ротации журналов состоит в их удалении при запуске демона syslogd и создании новых, чистых журналов. Например, ввод следующих команд

# rm /var/log/messages

# kill -HUP `cat /var/run/syalogd.pid

приводит к удалению файла /var/ log/messages и созданию нового при перезапуске sys logd. Подобная стратегия хорошо работает только в однопользовательских и домашних системах, где нет большой надобности в хранении старых журналов. Что касается многопользовательских серверов, то здесь историческая информация имеет особую ценность, особенно при отслеживании возможных нарушений безопасности. В этом случае удобна иная стратегия ротации - сохранение одного поколения журналов, при котором при запуске syslogd журналы не удаляются, а переименовываются.

#

mv /var/log/messages /var/log/messages.1

#

kill -HUP `cat /var/run/syslogd.pid"

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

# mv /var/log/messages.1 /var/log/messages.2

# mv /var/log/messages /var/log/messages.1

#

kill -HUP

`

cat /var/run/syslogd.pid'

Эту

процедуру следует автоматизировать, выполняя ее, к примеру, еженедельно в установленное время. Для этого надо написать сценарий процедуры ротации. На сервере Linux Red Hat 7.1 при сохранении одного поколения журналов сценарий будет выглядеть примерно так:

#!/bin/sh

mv /var/log/messages /var/log/messages.1

mv /var/log/secure /var/log/secure.

1

mv /var/log/maillog /var/log/maillog.1

mv /var/log/spooler /var/log/spooler.1 kill -HUP `

cat /var/run/syslogd.pid'

Файл сценария (например, /usr/local/bin/newlogs) создается в текстовом редакторе, затем преобразуется в выполняемый файл.

# chmod

755 /usr/local/bin/newlogs

Далее, требуется внести соответствующую запись в файл crontab, воспользовавшись одним из двух методов, описанных ранее. Запись для запуска сценария каждое воскресное утро в 12.01 имеет следующий вид:

1 12 * * sun /usr/local/bin/newlogs

Примечание

В Red Hat Linux 7.1 ротационный процесс автоматизирован с помощью файла /etc/logro-tate. conf. Первые две команды этого файла выполняют ротацию журналов каждую неделю с использованием четырех недельных журналов. Например, вы можете располагать пятью журналами: /var/log/messages И С /var/log/messages . 1 ПО /var/log/messages . 4.



USB-клавиатура


У многих современных компьютеров корневой USB-хаб размещен на материнской плате. Встроенный в нее BIOS должен в полной мере поддерживать USB-клавиатуру. В такой ситуации, вам, вероятно, не нужны никакие дополнительные сведения о USB для организации поддержки клавиатуры ядром Linux-системы.

Однако если на вашем компьютере установлена другая операционная система (не Unix/Linux), BIOS, который не выполняет конфигурирование USB, или специфическая клавиатура, то вам потребуется поддержка USB-клавиатуры. Если вы для решения этой задачи рекомпилируете ядро системы, избегайте клавиатурной поддержки средствами USB HIDBP, поскольку в системе Linux они мало что дают.

Предупреждение

Загрузчик Linux (LILO) запускается еще до того, как Linux получает возможность распознать USB-клавиатуру. Поэтому, если USB-поддержка не встроена в материнскую плату вашего компьютера и не определяется средствами BIOS, вы не сможете использовать клавиатуру для ответа на запрос boot:, выдаваемый LILO. Чтобы обойти эту проблему, воспользуйтесь услугами других загрузчиков, например, Partition Magic или System Commander.



Утилиты KDE


В комплект KDE входит ряд стандартных утилит для просмотри текста и графики, управления проектами и администрирования системы Linux. Рассмотрим наиболее популярные из них.



Что такое Web-сервер


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

Очень часто этот термин имеет двойное значение, обозначая и компьютерное оборудование, и программное обеспечение, выполняемое на компьютере. Корректно использовать термин "Web-сервер" для обозначения программного обеспечения, запускаемого для ответа на запросы Web-клиентов, например Web-браузеров.

Программное обеспечение Web-сервера предназначено для отображения документов, использующих HTTP (Hypertext Transfer Protocol - Протокол передачи гипертекста) и доступных на Web-сайте в ответ на запросы клиентов. Web-сайт использует программное обеспечение Web-сервера.

Последовательность действий следующая: клиент запрашивает документ при помощи URL; Web-сервер принимает запрос, находит в системе URL, соответствующий заданному, - физический файл (который может быть файлом HTML или файлом другого типа). Убедившись, что клиент

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




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

Для установки Linux у вас есть чистый жесткий диск или диск, который можно переформатировать.

Вы можете установить Linux в чистый раздел диска или раздел, который можно переформатировать.

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



Просмотр текста и графики


В KDE есть текстовый редактор, программа просмотра изображений и графический редактор (аналогичный программе paintbrush). Запуск этих программ несложен. Стандартный текстовый редактор KEdit запускается выбором в главном меню элемента Editors (Редакторы), а в нем -команды Text Editor (Текстовый редактор). Для доступна к более мощному редактору текстов KWrite следует выбрать в главном меню элемент Editors (Редакторы), а в нем - команду Advanced Editor (Усовершенствованный редактор).

Аналогичным образом через подменю Graphics (Изображения) возможен доступ к ряду программ просмотра изображений, включая KView (подобная Image Viewer), KDE Pixmap2Bitmap и Xpaint. Можно также обратиться к The GIMP как к инструменту редактирования изображения, воспользовавшись тем же самым подменю Graphics.

Щелчок правой кнопкой мыши на соответствующем файле в окне диспетчера файлов Konqueror

позволяет открыть файл, используя проходящее приложение. Например, после щелчка правой кнопкой мыши на тестовом файле и выбора в контекстном меню команды Open With (Открыть с помощью) можно указать необходимое для открытия файла приложение (рис. 11.18).

Рис. 11.18.

Использование диспетчера файлов Konqueror для открытия текстового файла с выбором приложения

Если необходима отсутствующая в подменю программа, щелкните на Other (Другие). В результате откроется окно диалога Open With (Открыть с помощью), позволяющее выбрать приложение из главного меню KDE.



с одним жестким диском емкостью


Рассмотрим простой пример. У нас есть компьютер с одним жестким диском емкостью 12 Гбайт, разбитый на два раздела по 6 Гбайт, представленные в DOS как диски С и D. На диске D можно освободить до 3 Гбайт для установки Linux.

Перед установкой необходимо выполнить две операции.

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

Провести переразбивку диска, чтобы получить раздел для установки Linux.



Дефрагментация диска

Процесс дефрагментации диска в Windows 98 достаточно прост.

Сохраните данные с дефрагментируемого диска.

В папке My Computer (Мой компьютер) или программе Windows Explorer (Проводник Windows) щелкните правой кнопкой мыши на значке дефрагментируемого диска.

Есть два основных способа получения корректных ISO-образов. Во-первых, их можно загрузить непосредственно из Internet, например, с такого узла как ftp. redhat. com. Объем загружаемого образа соответствует размеру содержащегося в нем диска и составит около 650 Мбайт. Альтернативный способ состоит в самостоятельном создании ISO-образа установочного диска Red Hat Linux 7.1, используя команду mkisof s. Более подробно эта процедура рассмотрена в гл. 5.

Конечно же, имея доступ к устройству CD-ROM нет надобности в установке с жесткого диска. Это делается тогда, когда программа установки не может распознать устройство. Однако, при использовании драйверов, доступных в упомянутом выше файле oldcdrom. img, такая ситуация возникает крайне редко.


Разбивка диска


Чтобы установить Linux, не уничтожая существующую операционную систему при отсутствии свободных жестких дисков или разделов, надо найти на жестком диске свободное место и отрегулировать его разбивку так, чтобы освободить раздел для установки. Как правило, для полной установки Linux требуется минимум 2 Гбайт, обязательно в одном разделе. В Windows каждый раздел представляется как отдельный диск (С, D, Е и т.д.), так что надо найти диск с как минимум 2 Гбайт свободного места.

Предупреждение

Red Hat не поддерживает fips.exe. Она защищена лицензией GPL, указывающей, что разработчики программы f ips. ехе не несут никакой ответственности, даже если вы корректно ее использовали и это привело к потере данных. Несмотря на то, что сам я много раз успешно пользовался этой утилитой, будьте осторожны: вы рискуете. Есть коммерческие программы управления разделами, такие как System Commander (www.v-com.com) и Partition Magic (www. power guest, com).

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

Программа f ips. ехе запускается в режиме эмуляции MS-DOS. Чтобы перейти в этот режим, в меню Start (Пуск) выберите команду Shut Down (Завершение работы) и установите переключатель Restart in MS-DOS Mode (Перезагрузить компьютер в режиме MS-DOS). Произойдет перезагрузка Windows 98 в полноэкранную среду DOS.

Предупреждение

Очень важное замечание: программу fips.exe нельзя запускать в окне DOS или полноэкранной эмуляции DOS в системе Windows 98. Дело в том, что, в отличие от DOS, Windows 98 допускает одновременное выполнение нескольких программ, и может возникнуть ситуация, при которой другая программа попытается получить доступ к области диска, обрабатываемой в это время утилитой f ips. ехе, что приведет к повреждению данных.

Перейдя в режим эмуляции DOS, запустите программу f ips . ехе. Если устройство CD-ROM представлено как диск Е, то команда запуска будет иметь вид: с:\>е:\dosutils\fips20\fips.exe



Управление Web-сервером


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



Управление временем


Linux не содержит оригинальную копию Microsoft Outlook или Project, однако в KDE есть несколько инструментов для управления временем.

В комплект КDЕ входит диспетчер времени KOrganizer с календарем событий, списком приоритетных заданий, расписанием и т.п. Чтобы запустить KOrganizer, выполните команду Organizer подменю Applications главного меню.

На рис. 11.19 показано главное окно программы KOrganizer. Из этого окна можно перейти к конкретным дням, дополнить список заданий и составить расписание событий на основе присвоенных приоритетов.

Кроме программы KOrganizer, в KDE есть программа учета времени, позволяющая запускать и останавливать часы для отслеживания времени, затрачиваемого на отдельные проекты. Программа запускается командой Personal Time Tracker (Персональный учет времени) подменю Utilities.

Кроме этого, в KDE есть утилита Address Book (адресная книга). В нее можно заносить сведения о деловых партнерах, друзьях и коллегах, с которыми надо поддерживать связь во время работы. Каждая запись адресной книги может содержать несколько телефонных номеров, номера факсов и множество адресов электронной почты. Адресная книга открывается командой Address Book подменю Utilities.

Рис. 11.19.

Программа «Organizer: календарь, список заданий и различные средства составления расписаний

Офисный пакет КDЕ

В KDE 2.0 появилась первая версия офисного пакета KOffice, включающего ряд мощных приложений, подобного пакетам Microsoft Office, Sun Star Office или Applix AnywareOffice. KOffice включает пять базовых приложений, доступ к которым возможен посредством подменю Office главного меню KDE.

KWord — представляет собой текстовый редактор, выполненный в стиле FrameMaker и способный импортировать файлы Microsoft Word.

KSpread - табличный процессор KOffice, показанный на рис. 11.20, может импортировать

файлы Microsoft Excel, а также данные с запятыми в качестве разделителей (CSV-формат).

KPresenter - представляет собой программу работы с презентациями, которая может импортировать файлы Microsoft PowerPoint.


KChart - позволяет создавать трафики и диаграммы.

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

Эти приложения можно объединить вместе в единую оболочку KOffice Workspace, которая позволяет запускать их в одном окне. Работа со всеми приложениями пакета KOffice в одном месте упрощает обмен данными между ними.

Кроме того, предусмотрены также такие инструменты, как Кгауоn - программа манипулирования изображениями KOffice, Kugar - генератор отчетов, Katabase - программа управления базами данных, KFormula для обработки формул и Kivio для построения диаграмм (граф-схем). По сведениям, доступным на момент написания книги Кгауоп и Kugar должны быть реализованы в следующей версии KOffice.





Рис. 11.20.

Табличный процессор KSpread из комплекта KOffice


Запуск и остановка Apache


Если Apache установлен при установке Red Hat, то загрузочные файлы во время старта системы уже настроены на запуск Apache. Эти настройки находятся в файле /etc/re. d/ init. d/ httpd. Данный файл является исполняемым сценарием, которому передаются два возможных параметра: start и stop. Если планируется использовать версию Apache, поставляемую с дистрибутивом Red Hat и расположение конфигурационных файлов не будет изменяться, то можно запускать и останавливать Web-сервер вручную, используя команду

#

/etc/re.d/init.d/httpd start

для запуска сервера и команду

#

/etc/re.

d/init.d/httpd stop

для останова сервера.

Примечание

Запуск и останов Web-сервера производятся пользователем root, чтобы главный процесс сервера мог изменять пользователей для запуска дочерних процессов при прослушивании соединений.

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

Обычно httpd находится в /usr/sbin/. Допустимы два ключа.

- f указывает на положение файла httpd. conf.

-d указывает на корневой каталог сервера, переназначая файл конфигурации.

Обычно достаточно использовать флаг - f, поскольку ServerRoot указан в файле httpd. conf. Например, если файлы конфигурации находятся в /home/httpd/conf, то запустить сервер можно с использованием следующей команды.

#

/uar/sbin/httpd -f /etc/httpd/conf/httpd.conf

Если сервер запущен самостоятельно, без использования /etc/re. d/init. d/httpd, и его надо остановить вручную, то нужно знать правильный ID процесса (PID) для сервера. PID сервера можно определить, используя команду ps.

#

ps -aux | grep httpd

Эта команда выдает список процессов подобный следующему.

apache 545 0.1 3.8 1104 572 ? S 17:52 0:00 [httpd]

apache 546 0.0 3 .8 1104 572 ? S 17:52 0:00 [httpd]

apache 547 0.2 3.8 1104 572 ? S 17:52 0:00 [httpd]

apache 548 0.1 3.8 1104 572 ? S 17:52 0:00 [httpd]

apacfie 549 0.0 3.8 1104 572 ? S 17:52 0:00 [httpd]

apache 550 0.3 3.8 1104 572 ? S 17:52 0:00 [httpd]

root 544 0.5 4 1104 592 ? S 17:52 0:00 /usr/sbin/httpd

Заметьте: все процессы принадлежат apache за исключением одного, принадлежащего root. Это родительский процесс всех процессов httpd, как раз тот, который нужно остановить командой

#

kill 544



Администрирование системы Linux


В KDE регулярно появляются новые средства системного администрирования. Наиболее полезные из них обеспечивают возможность управления пакетами rpm, пользователями и группами пользователей, процессами, выполняемыми в системе, и сценариями инициализации System V.

Эти утилиты запускаются командами подменю Utilities или System главного меню.

В большинстве задач администрирования Linux все еще приходится работать с некоторыми текстовыми конфигурационными файлами, но использование инструментов наподобие KPackage позволяет решить эти задачи намного проще. Чтобы запустить KPackage, выполните команду Package Manager подменю System. В открывшемся окне программы будет приведена вся информация о пакетах RPM в системе (рис. 11.21 на след. стр.).

В этом окне можно просматривать пакеты, выполнять поиск отдельных пакетов и файлов в системе, а также устанавливать новые пакеты.



Управление пользователями и группами


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

Создавать пользователей очень просто. Для этого достаточно воспользоваться командой htpasswd, которая при обычной установке Apache из дистрибутива Red Hat Linux находится в

/usr/bin/htpasswd. Эта программа используется как для создания файла паролей, так и для добавления индивидуальных пользователей. Файл паролей выполняет функцию хранилища имен пользователей и зашифрованных паролей, используемых Apache для управления доступом.

#

htpasswd -с filename user-name

При выполнении этой команды создается файл

filename

и добавляется первый пользователь. Флаг -с указывает, что файл нужно создать. Файл паролей может находиться где угодно, лишь бы он был доступен для Web-сервера Apache. Неплохим местом для него может служить каталог с файлами конфигурации. Например, команда

#

htpasswd -с /etc/httpd/conf/users userl

создает файл пользователей в том же каталоге, что и другие файлы конфигурации Apache, и до-бавляегв него пользователя userl.

При выполнении этой команды программа дважды запрашивает пароль - для проверки его корректности. Затем пароль шифруется и записывается в /etc/httpd/conf /users. Соответствующая строка этого файла выглядит примерно так:

userl:N3ImVAxFtiv0

Формат строки: имя пользователя, двоеточие и зашифрованный пароль. Информация о каждом пользователе находится на отдельной строке.

Хотя это выглядит, как пароли в системном файле паролей (/etc/passwd), и файл паролей Apache зашифровывается аналогично, процесс шифрования в htpasswd совсем иной. Нельзя просто скопировать зашифрованные пароли из /etc/passwd для создания файла паролей Apache.

Для добавления пользователей после создания файла используется команда htpasswd без флага -с.




$ htpasswd /etc/httpd/conf/users user2



Эта команда добавляет пользователя user2, дважды запрашивая пароль..Результирующий файл паролей содержит две строки.

user1:N31mVAxFtiv0. user2:WROTrb116.3pPk

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

Этот файл содержит один или несколько элементов, каждый из которых находится в отдельной строке,

имеющей формат:

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

authors: user1 user2


Управление протоколами


Последняя рассматриваемая функция администрирования - управление протоколами. Apache создает два важных протокола: протокол доступа и протокол ошибок. Вместе они обеспечивают важной информацией многие функции, включая отладку ошибочных сценариев CGI и генерацию статистических отчетов доступа с подробной информацией об использовании Web-сайта.

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

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

Red Hat Linux 7.1 включает протоколы Apache в каталог /var/log/httpd. Они чередуются ; другими протоколами из /var/log в ежедневном режиме, как указано в сценарии /etc/ cron.daily/logrotate.

Для чередования протоколов используется утилита rotatelogs, поставляемая с дистрибутивом Apache. По умолчанию Red Hat Linux устанавливает ее в /usr/sbin/rotatelogs. Для использования программы добавьте следующую строку в файл httpd. conf.

TransferLog " |/usr/sbin/rotatelogs /some/location/file time"

Элемент /sorae/location/f ile дает базовое имя файла для чередующихся протоколов Число, соответствующее системному времени начала протоколирования, добавляется к имена файла. Параметр time, в секундах, указывает, как часто выполняется чередование протоколов.



Защита каталогов посредством управления доступом


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

Для управления доступом в этом файле используются следующие основные команды:

AuthUserFile

AuthGroupFile

AuthName

AuthType

require

order

deny

allow

AuthUserFile И AuthGroupFile

Команды AuthUserFile и AuthGroupFile позволяют указать расположение файлов пользователей и групп. В нашем примере эти команды следующие:

AuthUserFile /etc/httpd/conf/users AuthGroupFile /etc/httpd/conf/groups

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

AuthName

AuthName используется для указания домена аутентификации. Это подсказка пользователям, чтобы они знали, как вводить имя и пароль. Например,

AuthName Authors Only

отображает пользователю подсказку Authors Only при запросе имени и пароля.

AuthType

AuthType предназначена для указания типа аутентификации, используемого для доступа к Web-странццам в перечисленных каталогах. Поскольку единственная доступная для AuthType опция basic, эта директива мало влияет на функционирование текущей версии Apache.

Require

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

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

require

valid-user

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

require user

usernamel username2 ивегпате3 . ..

Для ограничения доступа членам групп используется строка

require group

groupname1 groupname2 grouрname3 ...

Order


Команда order используется в сочетании с элементами deny и allow для управления доступом на уровне хостов, а не пользователей. Используя order, deny и allow можно разрешить доступ только конкретным хостам, задав их IP-адреса или имена.

Команда order указывает порядок применения команд deny и allow. Например, в команде order allow,deny вначале выполняется команда allow, и если хост клиента не соответствует условиям команды allow, то выполняется команда deny. Аналогично, order deny, allow

изменяет порядок, выполняя вначале команду

deny.



Deny

Команда deny указывает, каким хостам запрещен доступ к каталогу. Возможны значения all, частичное имя хоста и частичный или полный IP-адрес. Например,

deny from all

означает, что всем хостам запрещен доступ. Аналогично,

deny from .juxta.com запрещает доступ всем хостам домена juxta. com. При использовании IP-адресов формат такой же:

deny from 194.148.43.195 Команда запрещает доступ указанному хосту.



Allow

Команда allow выполняет обратную по сравнению с deny функцию: указывает, каким хостам разрешен доступ к данному каталогу. Она имеет те же параметры, что и команда deny.



Создание файла доступа

Рассмотрим все эти команды на двух примерах: разрешение доступа для группы и разрешение доступа по имени домена.



Разрешение доступа для группы

Следующий пример файла . htaccess разрешает доступ к конкретному каталогу только пользователям группы authors.

AuthName Authors Only AuthUserFile /etc/httpd/conf/users AuthGroupFile /etc/httpd/conf/groups require group authors

Заметьте: в этом примере указана команда AuthName для подсказки, указаны файлы паролей и групп, а также то, что пользователь должен быть членом группы authors для получения доступа к каталогу.



Разрешение доступа по имени домена

Следующий пример файла . htaccess разрешает доступ к конкретному каталогу только пользователям, которые обращаются к Web-сайту из хоста, находящегося в домене juxta.com:

order allow,deny allow from.juxta.com deny from all

Обратите внимание на порядок следования allow и deny. Логика работы следующая: при обращении к каталогу имя домена хоста сравнивается с доменом juxta. com. Если хост находится в этом домене, то доступ предоставляется. Если нет, то выполняется анализ по команде deny. Так как она запрещает доступ всем хостам, то запрашивающему хосту доступ не предоставляется.


Построение Web-сайта


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

Построим сайт, который будет содержать информацию о небольшой издательской компании On The Web Publishers. Разместим на сайте список новых изданий, общую информацию об издателе, форму для контактов и защищенный паролем раздел для эксклюзивного использования авторами, имеющим контракт с издателем.

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

Определим структуру сайта, как показано на рис. 32.2.

Рис. 32.2.

Структура Web-сайта

Создадим файлы, необходимые для реализации этой структуры. Подразумевая использование конфигурации, рассмотренной ранее в главе, поместим корневой каталог для дерева HTML-документов в /var /www/html, а каталог CGI - в /var /www/cgi-bin. Дерево каталогов и файлов:

/var/www/html/index.html

/var/www/html/about/index.html

/var/www/html/books/index.html

/var/www/html/contact/index.html

/var/www/html/authors/index.html

/var/www/cgi-bin/formmail

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

/var/www/html/images/

Так как в главе не рассматривался язык HTML, оценим два HTML-файла в качестве примеров соответствующих документов. Начнем с главной домашней странички /var/www/html/ index. html. В данном случае исходный текст файла может быть следующим.

<HTML>

<HEAD>

<TITLE>On the Web Publishers</TITLE>

</HEAD>

<BODY BGCOLOR=lightcyan TEXT=midnightblue>

<DIV ALIGN=CENTER>


<A HREF="/">

<IMG SRC="/images/logo.gif" BORDER=0></A>

<table CELLPADDING=5 CELLSPACING=5

BGCOLOR=1ightp ink> <TR>

<TD ALIGN=CENTER><A HREF="about">AB00T U</A></TD>

<TD ALIGN=CENTER><A HREF="books">OUR

BOOKS</A></TD>

<TD ALIGN=CENTER><A HREF="contact">CONTACT

US</A></TD> <TD ALIGN=CENTER><A HREF="authors">JUST FOR

AUTHORS</A></TD>

</TR> </TABLE> </DIV>

<FONT SIZE=5>W</F>elcome to <STRONG>On the Web Publishers</STRONG>.

We offer the finest in on-line electronic books at .reasonable prices. Check out what we have to offer ...

<UL>.

<LI><A HREF="about">Learn about what we do</A>

<LI><A HREF="books">See what books we offer</A>

<LI><A HREF="contact">Contact us</A>

</UL>

</BODY> </HTML>

Результат работы этого файла показан на рис. 32.3.



Рис. 32.3.



Домашняя страница

Остальные страницы будут выглядеть примерно так же, кроме формы для контактов /var/ www/html/contact/index.html. Форма для контактов показана на рис. 32.4, она реализуется следующим исходным кодом.

<HTML>

<TITLE>On the Web Publishers</TITLE> </HEAD>

<BODY BGCOLOR=lightcyan TEXT=midnightblue>

<DIV ALIGN=CENTER>

<A HREF="/">

<IMG SRC="/images/ldgo.gif" BORDER=0></A>

<table CELLPADDING=5 CELLSPACING=5

BGCOLOR= 1 ightp ink> <TR>

<TD ALIGN=CENTER><A HREF="/about">ABOUT

US</A></TD>

<TD ALIGN=CENTER><A HREF="/books">OUR

BOOKS</A></TD>

<TD ALIGN=CENTER BGCOLOR=yellow>CONTACT

US</TD> <TD ALIGN=CENTER><A HREF="/authors">JUST FOR



AUTHORS</A></TD> </TR> </TABLE>

<Hl>Drop Us A Line ...</H1> </DIV>

<TABLE ALIGN=CENTER><TR><TD>

<FORM METHOD=POST ACTION="/cgi-bin/formmail">

<INPUT TYPE=TEXT WIDTH=30 NAME=name> Name<BR>

<INPUT TYPE=TEXT WIDTH=30 NAME=address> Address<BR>

<INPUT TYPE=TEXT WIDTH=30 NAME=city> City<BR>

<INPUT TYPE=TEXT WIDTH=30 NAME=state> State<BR>

<INPUT TYPE=TEXT WIDTH=30 NAME=zip> Zip/Post Code<BR>

<INPUT TYPE=TEXT WIDTH=30 NAME=country> Country<BR>

<INPUT TYPE=TEXT WIDTH=30 NAME=email> E-mail<BR>

Comments:<BR>

<TEXTAREA ROWS=10 COLS=30 NAME=commentS

WRAP=HARD></TEXTAREA><BR>

<INPUT TYPE=SUBMIT VALUE="Send Comments"> </FORM> </TD></TR></TABLE>

</BODY> </HTML>



Рис. 32.4.



Форма для контрактов

Эта страница содержит форму и ссылку на CGI-программу, которая обрабатывает данные из формы. В нашем случае используется программа f ormmail (бесплатно распространяемый сценарий CGI, написанный на Perl), которая считывает содержимое формы и отправляет его по почте на предопределенный почтовый адрес. В рассматриваемом примере контактная информация из формы отправляется по почте на главный почтовый адрес книжного магазина.

Forramail написал Matthew M. Wright. Эта программа доступна по адресу http: / /www. worldwideniart.com/scripts/formmail .shtml. Несмотря на то, что в главе не затрагивалось программирование на Perl и CGI, мы приводим исходный код программы. Можно заметить, что создание несложных CGI-программ не требует особых усилий.

#!/usr/bin/perl ################################

# FonriMail Version

1.6 #

# Copyright 1995-1997 Matt Wright mattw@worldwidemart.com #

# Created 06/09/95 Last Modified 05/02/97 #

# Matt's Script Archive, Inc.:

http://www.worldwidemart.com/scripts/




######################################

# COPYRIGHT NOTICE #

#Copyright 1995- 1997 Matthew M. Wright All Rights Reserved. #

# #

# FormMail может быть использована и свободно модифицирована любым

# пользователем, при условии сохранности авторских прав и

# комментариев, приведенных выше. Используя этот код, вы

# соглашаетесь не требовать от автора возмещения убытков при любых

# обстоятельствах, которые могут возникнуть при ее использовании.

#

# Продажа кода этой программы без предварительного письменного согласия

# категорически запрещена. Прежде чем получить деньги за мою программу,

# спросите меня.

#

# Получите разрешение перед распространением этого программного

# обеспечения в пределах Internet и любого другого окружения. Во всех

# случаях знаки авторского права и заголовок должны быть сохранены

######################################

# Определение переменных #

# Более подробную информацию можно найти в файле README. #

# $mailprog определяет местонахождение программы sendmail в системе unix. #

$mailprog = Vusr/lib/sendmail';

# @referers разрешает формам находиться только на серверах, определенных

# в этом поле. Это корректировка безопасности по сравнению с предыдущей

# версией, которая позволяла любому пользователю на любом сервере

# использовать сценарий FormMail на своем Web-сайте.

# referers = Clinux.juxta.com');

# Конец

######################################

# Проверка ссылающегося URL &check_url;

# Получить дату &get_date ;

# Разобрать содержимое формы &parse_form;

# Проверить обязательные поля &check_required;

# Возвратить HTML-страницу или перенаправить пользователя &return_html ;

# Послать E-Mail &send_mail;

sub check_url {

# Локализировать флаг check_referer, который определяет,

# является ли пользователь допустимым. local ($check_referer) = 0;

# Если был- указан URL рекомендателя, убедиться, что для каждого

# допустимого рекомендателя в FormMail передан правильный URL.



if ($ENV{'HTTP_REFERER'}) {

foreach $referer (Oreferers) {

if ($ENV{toTP_REFERER'} =~ m|https? : // ( [^/] *) $referer | i) {

last;

} } }

else {

$check_referer = 1;

}

# Если HTTP_REFERER был недопустимым, возвратить ошибку.



if ($check_referer != 1) { &error <bad_referer') }

}

sub get_date {

# Определить массивы для дней недели и месяцев года.

@days = ('Sunday','Monday','Tuesday','Wednesday',

'Thursday', 'Friday', 'Saturday') ;

@months = ('January','February',"March','April', 'May','June','July', 'August','September', 'October','November','December') ;

# Получить текущее время и формат часов, минут и секунд. Добавить

# 1900 к году, чтобы получить полный 4-цифровой год.

($sec,$min,$hour,$mday,$mon,$year, $wday) = (localtime(time))[0,1,2,3,4,5,6];

$time = sprintf ("%02d:%02d:%02d", $hour, $min, $sec) ; $year += 1900;

# Сформатировать дату.

$date = "$days[$wday], $months[$mon] $mday, $year at $time";

}

sub parse_form {

# Определить ассоциативный массив для конфигурации

# Config = ('recipient',", 'subject',",

'email',", 'realname', ",

'redirect

1

,'

1

, 'bgсоlоr', ",

'background',", 'link_color',",

'vlink_color', ' ', 'text_color', ' ',

'alink_color',", 'title',",

'sort', ' ', 'print_conf ig', ' ',

'required' , " , 'eny_report' , " ,

'return_link_title', ' ', 'return_link_url', ' ',

'print_blank_f ields

1

, ' ', 'missing_f ields_redirect', ") ;

# Определить для формы REQUEST_METHOD (GET или POST) и распределить

# поля формы по парам имя-значение. Если REQUEST_METHOD не был ни

# GET, ни POST, выдать ошибку.

if ($ENV{'REQUEST_METHOD'} eg 'GET') {

# Разложить по парам имя-значение @pairs = split (/&/, $ENV{'QUERY_STRING'} ) ;

}

elsif ($ENV{'REQUEST_METHOD'} eg 'POST') {

# Считать входную информацию read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'} ) ;



# Разложить по парам имя-значение

Opairs = split (/&/, $buf fer) ; } else {

&error ('request_method') ;

}

# Для каждой пары имя-значение

foreach $pair (Opairs) {

# Разложить пару по отдельным переменным local($name, $value) = split(/=/, $pair) ;

# Декодировать кодировку формы для переменных имени и значения

$name =~ tr/+/ / ;

$name =~ s/% ( [a-fA-FO-9] [a-fA-FO-9] ) /packC'c", hex($l) ) /eg;

$value =~ tr/+/ /;

$value =~ s/% ( [a-fA-FO-9] [a-fA-FO-9] )/pack("C", hex($l) ) /eg;

# Если они пытаются использовать включения со стороны сервера,

# удалить их, чтобы они не были угрозой безопасности, если html

# будет возвращен. Еще одна брешь в защите перекрыта.

$value =~ s/<!-( . |\n)*->//g;

# Если имя поля указано в массиве %Config, по вызову

# defined ($Config{$name) }) будет возвращена 1 и нам нужно связать

# это значение с соответствующей переменной конфигурации. Если же

# это не конфигурационное поле формы, записать его в ассоциативный

# массив %Form, добавив перед значением ', ', если там уже есть

# какое-то значение. Также сохраним порядок полей формы в массиве

# @Field_Order, чтобы можно было использовать этот порядок при

# обычной сортировке.

if (defined($Config{$name))) { $Conf ig{$name) = $value,-

else {

if ($Form{$name) && $value) {

$Form{$name) = "$Form{$name} , $'value";

elsif ($value) {

push(@Field_Order,$name); $Form{$name} = $value;

} }

# Последующие шесть строчек удаляют лишние пробелы и символы перевода

# строки из переменных конфигурации, которые могут появиться в случае,

# если редактор переносит строки после некоторой длины строки или если

# были использованы пробелы между именами полей или переменными среды.

$Config{'required'} =- s/ (\s+|\n)?,(\s+|\n)?/,/g;

$Config{'required'} =- s/ (\s+) ?\n+ (\s+) ?//g;

$Config{'env_report'} =- s/ (\s+ | \n) ?, (\s+ | \n) ?/ , /g;

$C6n£ig{'env_repO3rt'} =-



s/

(\s+)

?\n+ ( \s-i-)

?

//g;

$Config{'print_config'} =- s/ (\s+| \n) ?, (\s+| \n) ?/, /g;

$Config{'print_config'} =- s/ (\s+) ?\n+ (\s+) ?,

# Разложить переменные конфигурации по отдельным именам полей.

@Reguired = split (/, / , $Conf ig{ 'required'} ) ;

@Env_Report = split ( / , / , $Conf ig{'env_report'} ) ;

@Print_Config = split (/,/, $Conf ig{'print_conf ig'} ); }

sub check_required {

# Локализация переменных, используемых в этой подпрограмме.

local ($require, @error) ;

if ( !$Config{ 'recipient '}) {

if (!defined (%Form) ) { &error (bad_referer') } else { kerror ('no_recipient') }

# Для каждого обязательного поля, определенного в форме:

foreach $require (@Required) {

# Если обязательное поле является email, проверить синтаксис email

# адреса, чтобы убедиться в его правильности.

if ($require eq 'email' && !&check_email ($Conf ig{$require} ) ) { /push ( ©error , $require) ;

}

# Иначе, если обязательное поле является полем конфигурации и не

# указано его значение или заполнено пробелами, выдать ошибку.

elsif (def ined($Config{$require} ) ) { if ( !$Config{$require) ) { push (@error , $require) ;

# Если обычное поле формы не заполнено или заполнено пробелами,

# отметить его как ошибочное поле .

elsif ( !$Form{$require}) {

push(@error,$require) ;

# Если найдено хотя бы одно ошибочное поле, послать пользователю

# сообщение об ошибке .

if (@error) { &error('missing_fields',@error) }

sub return_html {

# Инициализировать локальные переменные,

# используемые этой подпрограммой.

local ($key, $sort_order , $sorted_field) ;

# Если используется опция переадресации, напечатать заголовок

# с адресом переадресации.

if ($Config{'redirect'}> {

print "Location: $Config{'redirect'} \n\n";

# Иначе, начать печать страницу ответа.

else {

# Напечатать заголовок HTTP и открывающие дескрипторы HTTP.,

print "Content -type: text/html \n\n";



print "<html>\n <head>\n";

# Напечатать заголовок страницы

if ($Config{'title'}) { print " <title>$Conf ig{'title'}</title>\n" } else { print " <title>Cnacибо</title>\n" } print " </head>\n <body>;

# Получить атрибуты дескриптора Body &body_attributes ;

# Закрыть дескриптор Body print ">\n <center>\n";

# Напечатать специальный или общий заголовок.

if ($Config{'title'}) { print " <hl>$Conf ig{'title'}</hl>\n" }

else { print " <h1>Спасибо Вам за заполнение данной формы</h1>\n" }

print "</center>\n";

print "Ниже находится предоставленная вами информация для ";

print "$Conf ig{'recipient'} . Текущая дата: ";

print "$date<pxhr size=l width=75\%><p>\n";

# Если указано, отсортировать по алфавиту:

if ($Config{'sort'} eq 'alphabetic') { foreach $ field (sort keys %Form) {

# Если поле имеет значение или установлена опция печати пустых

# полей, то распечатать поле формы и его значение.

if ($Config{'print_blank_f ields'} || ?Form{$field}) {

print "<b>$field:</b> $Form{$field}<p>\n";

# Если указан порядок сортировки, отсортировать поля

# формы в указанном порядке.

elsif ($Config{'sort'} =~ /Border :.*,.*/) {

# Присвоить временной переменной $sort_order порядок сортировки,

# убрать лишние переносы строк и пробелы, убрать команду order:

# и разложить поля сортировки в массив.

$sort_order = $Conf ig{'sort'} ;

$sort_order =~ s/(\s+|\n)?, (\s+| \n) ?/, /g;

$sort_order =~ s/ (\s+) ?\n+(\s+)?//g;

$sort_order =~ s/order://;

@sorted_f ields = split (/,/, $sort_order) ;

# Для каждого поля сортировки, если у него есть значение

# или если установлена опция печати пустых полей,

# распечатать поле формы и его значение. foreach $sorted_f ield (@sorted_f ields) {

if ($Config{'print_blank_f ields'} || $Form{$sorted_field) ) { print "<b>$sorted_field:</b> $Form{$sorted_field}<p>\n" ;



# Иначе, использовать порядок, в котором поля были переданы.

else {

# Для каждого поля формы, если оно имеет значение или

# установлена опция печати пустых полей, распечатать поле

# формы и его значение. foreach $ field (@Field_Order) {

if ($Config{'print_blank_f ields'} | | $Form{$f ield} ) { print "<b>$field:</b>' $Form{$f ield}<p>\n";

}

print "<p><hr size=l width=75%xp>\n";

# Проверить наличие ссылки возврата и распечатать ее, если нашли.

if ($Config{'return_link_url'} && $Conf ig{'return_link_title'} ) {

print "<ul>\n";

print "<lixa href =\"$Conflg{'return_link_url'} \">$Conf ig{'return_

->link_title'}</a>\n";

print "</ul>\n";

# Распечатать нижнюю часть страницы.

print «"(END HTML FOOTER)";

<hr size=l width=75%xp>

<centerxfont size=-lxahref="http: //www.worldwidemart.com/scripts,

->formmail.shtml">FormMail</a> V1. 6 &copy;

1995 -1997 Matt Wright <br> A Free Product of

<a href="http: //www.worldwidemart .com/scripts/">Matt ' s

->Script Archive, Inc.</ax/fontx/center>

</body>

</html>

(END HTML FOOTER)

sub send_mail {

# Локализация переменных, используемых в этой подпрограмме.

local ($print_conf.ig, $key, $sort_order, $sorted_field, $env_report) ;

# Открыть почтовую программу open (MAIL, " | $mailprog -t") ;

- print MAIL "To: $Config{'recipient'}\n";

print MAIL "From: $Conf ig{'email'} ($Config{'realname'} ) \n" ;

# Проверить тему сообщения

if ($Conf ig{ ' subject '}) { print MAIL "Subject:

$Conf ig{'subject'} \n\n"} else {print MAIL "Subject: WWW Form Submission\n\n" }

print MAIL "Ниже находится предоставленная вами информация .

От кого : \n" ; print MAIL "$Conf ig{'realname'} ($Conf ig{'email'} ) , дата:



$date\n"; print MAIL "-" x 75 . "\n\n";

if (@Print_Config) " {

foreach $print_conf ig (@Print_Conf ig) { if ($Conf ig{$print_conf ig} ) {

print MAIL "$print_config: $Config{$print_conf ig} \n\n";

} } }

# Если указано, отсортировать по алфавиту:

if ($Config{'sort'} eq 'alphabetic') { foreach $field (sort keys %Form) {

# Если поле имеет значение или установлена опция печати пустых

# полей, распечатать поле формы и его значение,

if ($Config{'print_blank_fields'} | | $Form{$field) $Form{$field} eq '0') {

print MAIL "$field: $Form{$field}\n\n"; } } }

# Если указан порядок сортировки, отсортировать поля

# формы в указанном порядке .

elsif ($Config{'sort'} = ~ /^order :.*,.*/) {

# Убрать лишние переносы строк и пробелы, убрать команду order:

# и разложить поля сортировки в массив.

$Config{'sort'} =~ s/(\s+|\n)?, (\s+ | \n) ?/ , /g;

$Config{'sort'} =~ s/ (\s+) ?\n+ (\s+) ?//g;

$Config{'sort'} =- s/order://;

@sorted_fields = split(/,/, $Config{'sort'} ) ;

# Для каждого поля сортировки, если у него есть значение или еслк

# установлена опция печати пустых полей, распечатать поле

# формы и его значение.

foreach $sorted_field (Ssorted_fields) {

if ($Config{ 'print_blank_f ields'} | | $Form{$sorted_field} | | $Form{$sorted_f ield} eq '0') { print MAIL "$sorted_field: $Form{$sorted_f ield}\n\n";

# Иначе, использовать порядок, в котором поля были переданы, else {

# Для каждого поля формы, если оно имеет значение или

# установлена опция печати пустых полей, распечатать

# поле формы и его значение, foreach $field (@Field_Order) {

if ($Config{'print_blank_fields'} | | $Form{$field} | | $Form{$field} eq '0') { print MAIL "$field: $Form{$field}\n\n";

}

}

}

print MAIL "-" x 75 . "\n\n";

# Если указаны переменные среды, послать их адресату,

foreach $env_report (@Env_Report) {

if ($ENV{$env_report}) {



print MAIL "$env_report: $ENV{$env_report}\n";

} } close (MAIL);

}

sub check_email {

# Инициализация локальной переменной email

# параметром вызова подпрограммы.

$email = $_[0];

# Если e-mail адрес содержит:

if ($email =- /(@.*@)|(\.\.)|(@\.) (\.@)|(^\.)/ ||

# e- mail адрес имеет неправильный синтакс. Или, если синтакс не

# соответствует следующему шаблону регулярного выражения, то

# проверка основного синтаксиса обнаруживает ошибку.

$email !~ /^.+\@(\[?)[a-zA-Z0-9\-\.3+\.([a-zA-Z] ->{2,3}|[0-9]{1,3})(\]?)$/) {

# Основной синтаксис требует: один или более символов перед

# знаком @, за которым следует необязательный символ '[',

# затем любое число букв, цифр, дефисов и точек

# (допустимые символы домена/IP), и в конце стоит точка,

# за которой находятся 2 или 3 буквы (для суффиксов домена)

# или от 1 до 3 цифр (для IP-адресов). В конце также может

# стоять символ

'

]

', так

как допустимо иметь email-адрес,

# подобный user@[255.255.255].

# Возвратить код ошибки, если e-mail

# адрес не удовлетворяет синтаксису, return 0;

}

else {

# Возвратить true, e-mail адрес соответствует правилам, return 1 ;

} }

sub body_attributes {

# Проверить цвет фона

if .($Config{ 'bgcolor'}) { print " bgcolor=\"$Config{'bgcolor'} \"" }

# Проверить фоновый рисунок

if ($Config{background'}) { print " > background=\"$Config{background'}\"" }

#Проверить цвет ссылок

if ($Config{'link_color'}) { print " link=\"$Conf ig{'link_color'} \" " }

# Проверить цвет посещенных ссылок

if ($Conf ig{'vlink_color'}) { print " vlink=\"$Conf ig{'vlink_color'} \"" }

# Проверить цвет активной ссылки

if ($Config{'alink_color'}) { print " alink=\"$Conf ig{'alink_color'} \"" }

# Проверить цвет текста

if ($Config{'text_color'}) { print " text=\"$Conf ig{'text_color'}A"" }



sub error {

# Локализация переменных и присвоение параметров подпрограммы.

local($error,@error_fields) = @_;

local($host,$missing_field,$missing_field_list);

if ($error eq tad_referer') {

if ($ENV{'HTTP_REFERER'} =~ m| ~https? :

// ( [ \w\ . ] ) | i) { $host = $1; print «"(END ERROR HTML) ";

Content-type: text/html

<html> <head>

<title>HeKoppeктным рекомендатель - в доступе отказано</title> </head>

<body bgcolor=#FFFFFF text=#000000> <center>

<table width=600 bgcolor=#9C9C9C>

<tr><th><font size=+2>Некорректный рекомендатель — в доступе

_>OTKa3aHo</fontx/th></tr> </table>

<table width=600 bgcolor=#CFCFCF> <tr><td>

Фopмa пытается использовать

<a href="http: //www.worldwidemart.com/scripts/formmail.shtiru">FormMail</a>

по адресу

<tt>$ENV{'HTTP_REFERER'}</tt>

, что является недопустимым для доступа к этому CGI-сценарию.<р>

Если Вы пытаетесь сконфигурировать FormMail для запуска этой формы,

->вам нужно добавить следующую информацию к \@referers, более

->подробно об этом написано в файле README.<р>

Добавьте <tt>'$host'</tt> в ваш массив <tt><b>\@referers</b></tt>.

->chr size=1> <centerxfont size=-l>

<a href="http: //www.worldwidemart.com/scripts/fonnmail.shtnil">

->FormMail</a> VI.6 &copy; 1995 - 1997 Matt Wright<br>

A Free Product of <a href="

http://www.worldwidemart.com/scripts/


">

->Matt's Script Archive, Inc.</a> </font></center>

</td></tr>

</table> </center> </body> </html>

(END ERROR HTML) } else {

print «"(END ERROR HTML)"; Content-type: text/html

<html> ' <head>

<title>FormMail vl.6</title> </head>



<body bgcolor=#FFFFFF text=#000000> <center>

<table width=600 bgcolor=#9C9C9C> <tr>

<th><font size=+2>FormMail</font></th></tr> </table>

<table width=600 bgcolor=fCFCFCF>

<tr><th><tt><font size=+l>Copyright 1995 - 1997 Matt Wright<br> Version 1.6 - Released May 02, 1997<br>

A Free Product of

<&

href="http: //www.worldwidemart.com/scripts/">

->Matt's Script Archive, Inc. </a></font>< /tt>< / th>< / tr> </table> </center> </body> </html> (END ERROR HTML)

} }

elsif ($error eg 'request_method') {

print «"(END ERROR HTML)"; Content-type: text/html

<html> <head>

<title>Ошибка: Метод 3anpoca</title> </head>

<body bgcolor=#FFFFFF text=#000000> <center>

<table width=600 bgcolor=#9C9C9C> <tr>

<th><font size=+2>Error: Request Method</font></th></tr> </table>

<table width=600 bgcolor=#CFCFCF>

<tr><td> Meтод запроса предоставленной Вами формы не совпадает ни с

<tt>GET</tt>, ни с <tt>POST</tt>. Пожалуйста, проверьте форму и

->убедитесь, что оператор

<tt>method=</tt> записан в верхнем регистре и является <tt>GET</tt>

->либо <tt>POST</tt>.<p>

<centerxfont size=-l>

<а href="http: / /www. worIdwidemart. com/scripts/ formmai1. shtml">

->ForMail</a> vi.6 &copy; 1995 - 1997 Matt Wright<br>

A Free Product of <a href="

http://www.worldwidemart.com/scripts/


">Matt's

->Script Archive, Inc.</a> </font></center> </td></tr>

</table> </center> </body> </html>

(END ERROR HTML) } elsif ($error eg 'no_recipient') {





print «"(END ERROR HTML)";

Content-type: text/html

<html> <head>

<title>Omn6Ka: Нет </head>

<body bgcolor=#FFFFFF text=#000000i> <center>

<table width=600 bgcolor=#9C9C9C> <tr><thxfont size=+2>Error: No Recipient</fontx/th></tr> </table>

<table width=600 bgcolor=iCFCFCF>

<tr><td> B переданных для FormMail данных не указан получатель. Пожалуйста, убедитесь, что Вы записали в поле формы 'recipient'

e-mail адрес. Более подробную информацию по заполнению поля формы recipient можно найти в файле README.<hr size=l>

<centerxfont size=-l>

<a href="

http://www.worldwidemart.com/scripts/formmail.shtml


">

->FormMail</a> VI.6 &copy; 1995 - 1997 Matt Wright

<br> A Free Product of <a href="

http://www


. worldwidemart. com/scripts/">Matt's

->Script Archive, Inc.</a>s </ f ontx/eenter> </td></tr> </table> </center> </body> </html>

(END ERROR HTML) }

elsif ($error eq 'missing_f ields') {

if ($Config{'missing_fields_redirect'}) {

print "Location: $Conf ig{'missing_£ields_redirect'} \n\n"; } else {

foreach $missing_field (@error_fields) {

$missing_field_list .= " <li>$missing_f ield\n";' }

print «"(END ERROR HTML)";

Content-type: text/html

<html> <head>

<title>Ошибка: Незаполненные пoля</title> </head> <center>

<table width=600 bgcolor=#9C9C9C>

<tr><th><font size=+2>0шибка: Незаполненные поля</font></th></tr> </table>

<table width=600 bgcolor=fCFCFCF> <tr>

<td>Следующие поля в предоставленной Вами форме незаполнены:<р>

<ul>

$missing_field_list </ulxbr>

Эти поля должны быть заполнены для успешной подачи формы. <р> Пожалуйста, используйте кнопку Back браузера для возврата к форме ->и исправьте данные. <hr size=l> <center><font size=-l>



<a href ="http : //www. worldwidemart . com/scripts/formmail.shtml">

->FormMail</a> VI. 6 &copy; 1995 - 1997 Matt Wright<br> A Free Product of

<a href="http: //www. worldwidemart. com/scripts/">Matt's

->Script Archive, Inc.</a> < / font>< / center> </td></tr>

</table> </center> </body> </html> (END ERROR HTML)

exit; }

Эта профамма возвращает пользователю HTML-страницу, сообщающую о том, что контактна)? информация в форме обработана или содержит ошибки, если таковые имеются. Это очень важный компонент всех CGI-программ - они должны либо вернуть правильные данные браузеру (например. HTML-документ или содержимое файла с изображением), либо перенаправить браузер на правильный URL.

Профамма f ormmail реализует много других функций: она может установить строку темь; (subject) при отправке e-mail и выполнить проверку того, что сценарий не используется незаконно пользователями с других Web-сайтов. Более детальная информация доступна на Web-сайте профаммы.

Последний, важный этап создания Web-сайта - оформление офаничений доступа для каталога /var/www/html/authors/, чтобы только уполномоченные пользователи имели доступ к файлам в этом каталоге. Чтобы сформулировать эти офаничения, нужно решить две задачи Во-первых, следует создать файл пользователей с перечнем необходимых пользователей (мы уже делали это в предыдущем парафафе, посвященном защите каталогов с использованием управления доступом). Нужно создать офаничения доступа для всех пользователей, которым предоставляется доступ к каталогу.

Во-вторых, нужно создать фуппу. Назовем ее authors, чтобы было проще выполнять работ по администрированию доступа к каталогу. Создается эта фуппа добавлением в файл групп (group) Web-сервера строки для фуппы, которая выглядит примерно так:

authors:

author1 author2 author3

Эта строка указывает, что трем пользователям предоставляется доступ к каталогу.



Наконец, нужно создать файл .htaccess в каталоге /var/www/html/authors/ ("Auth" в приведенных ниже командах относится к аутентификации, authentication, а не к нашей группе authors).

AuthName Just For Authors AuthType Basic

AuthUserFile /etc/httpd/conf

/users AuthGroupFile /etc/httpd/conf

/groups require group authors

AuthName указывает отображаемую пользователю подсказку. AuthUserFile сообщает серверу, где искать список допустимых пользователей и паролей, a AuthGroupFile - где находится список допустимых групп. Наконец, команда require указывает, что только членам группы authors нужно предоставить доступ к каталогу.

Если пользователь попытается получить доступ к данному каталогу в начале сессии, он увидит диалоговое окно аутентификации, отображаемое браузером, подобное тому, которое отображает Netscape-(pnc. 32.5).



Рис. 32.5.



Диалоговое окно аутентификации пользователя в Netscape

По умолчанию, если пользователь не пройдет аутентификацию, он получит страницу с сообщением об ошибке и предложением пройти аутентификацию. Для предоставления специализированной страницы, извещающей об ошибке аутентификации, следует отредактировать файл httpd.conf, чтобы указать на специализированное сообщение об ошибке, добавив в файл следующую строку:

ErrorDocument 401 /error.html

Этот элемент указывает, что при возникновении ошибки 401 (Authorization Required - Требуется аутентификация) сервер должен возвращать указанный URL вместо сообщения по умолчанию. Когда пользователь не пройдет аутентификацию, он получит модифицированную страницу с сообщением о неудачной аутентификации.