Администрирование локальных сетей
1. Общий обзор архитектуры UNIX систем. 5
Краткий обзор UNIX подобных операционных систем. 5
Основные причины популярности UNIX. 5
Структура операционной системы. 5
Задачи выполняемые ядром операционной системы 6
Подсистема управления процессами. 7
Подсистема управления памятью. 7
Файловая подсистема. 8
Подсистема ввода-вывода. 8
2. Шеллы и основные команды HP-UX. 9
Общее знакомство с шелами 9
Bourne Shell. 10
C Shell . 42
Korn Shell и POSIX shell 57
Key Shell (keysh). 65
3. Администрирование системы X Window 69
Базовые концепции X Window 69
Компоненты системы X Window 69
Предварительное конфигурирование 70
Имена и классы клиентов 73
Имена и классы ресурсов 74
Типы ресурсов 74
Управление шрифтами 75
2. Программирование на HP-UX 82
Этап линкирования. 85
Работа с библиотеками 85
Создание архивной библиотеки. 89
Открытие Библиотек Распределеного доступа 91
Создание Общедоступной Библиотеки с ld 92
Модифицирование Общедоступной Библиотеки 93
Применение make 94
Отладчик ADB 103
Отладчик XDB 109
3. Примеры команд 110
VARIABLES 117
LOCATIONS 117
FORMATS 118
4. Системные вызовы и взаимодействие с UNIX. 119
Время в UNIX. 124
Сигналы. 131
Деления просесса 135
Пайпы и FIFO-файлы. 135
Нелокальный переход. 138
Разделяемая память 139
Семафоры 140
Очереди сообщений 142
5. Старт системы. 146
6. Run-levels. 150
Остановка системы 155
Конфигурирование ядра системы 158
7. Изменение системных параметров 161
Инсталирование периферии 164
Системная конфигурация 165
Управление процессами 173
Управление процессами и ядро системы 182
8. 1. Файловая система HFS. 185
Структура файловой системы HFS 186
Главный суперблок 186
Группы цилиндров 187
Размер 187
Блоки данных 189
Доступ к блокам данных 190
Модификация файлов в HP-UX 193
Менджер логических дисков LVM 194
Создание корневой VG и корневого LV 201
Резервное копирование и свосстановление конфигурации Volume Groups 202
Перемещение и переконфигурирование дисков 203
3. Особенности файловой системы VxFS 206
Монтирование и демонтирование файловых систем 208
Проверка файловых систем 209
10. Мониторинг использования дискового пространства 212
11. . Организация веб-сайта 214
Выбор операционной системы. 214
Выбор программного обеспечения сервера. 215
Анализ веб-серверов. 216
Инсталляция веб-сервера. 217
Стратегическое планирование. Определение объема работы. 221
Тактическое планирование сайта. Разработка структуры. 226
Дизайн интерфейса. 228
Программирование. 230
Публикация и Маркетинг. 233
12. Веб-страницы и веб-приложения. 235
Классификация веб-объектов. 235
Спецификация DTD. Понятие ортогональности и методы ее реализации. 236
Веб-страницы. Языки разметки. (HTML, XML) 237
Веб-страницы. Программирование (" onclick="return false">
Модульность и ортогональность с использованием существующих технологий. 288
Веб-приложения. 289
Общие требования к страницам сайта. 290
Совместимость с различными браузерами. 292
13. Конфигурация и управление веб-серверами. 295
Встроенные средства управления сервером. (apachectl, apxs) 295
Глобальные разделы конфигурации. 296
Вспомогательные скрипты тАУ просмотр и ротация логов, статистика посещений. 299
Безопасность веб-сервера. 299
Организация доступа и разграничение прав пользователей. 303
. Подключение новых модулей и апгрейд программного обеспечения веб-сайта. 303
14. Администрирование веб-сервера. 304
Логгирование и поиск ошибок. 305
Обеспечение безопасности . 311
Создание резервных копий. Технологии: Backup, mirroring. 313
15. Система безопасности HP-UX 314
16. Политика и планирование системы безопасности 314
Установка Trusted Системы 315
Управление паролями и системным доступом 316
17. Управлением доступом к файлам и каталогам 317
Контроль безопасности сети (networks) 319
1. Общий обзор архитектуры UNIX систем.
Краткий обзор UNIX подобных операционных систем.
В даный момент, не существует стандартной системы UNIX, вместо этого вы столкнетесь со множеством операционных систем, имеющих свои названия и особенности. Но за этими особенностями и названиями прослеживается общая архитектура, интерфейс и среда программирования. Все эти системы так или иначе являются родственными Из-за своей простоты, ясности, легкой способности к расширению и модификации UNIX стали переносить на множество платформ. Однако несмотря на множество реализаций базовой системы, среди всех них можно четко выделить две основные ветки: System V UNIX и BSD UNIX. Различия между ними не носят принципияльный характер и зачастую сказать к какой из веток принадлежит та или иная реализация операционной системы бывает сложно. К основным различиям между System V и BSD подобными системами можно отнести терминальную инициализацию, имена конфигурационных файлов и файлов инициализации системы, стандартный размер блоков файловой системы, управление терминалами, различное отображение информации о процессах и.т.п. Одним словом принципиальных различий с точки зрения пользователя между разными ветками операционной системы UNIX не существует. Рассматриваемая нами операционная система HP-UX 10.20 является одной из реализаций UNIX выпущенной фирмой Hewlett-Packard. По своей структуре это чистая System V подобная 32-х разрядная операционная система, включающая поддержку симметричных многопроцессорных систем (SMP), файловых систем большего объема (до 128Гб) и расширенного виртуального адресного пространства (до 3.75 Гб).
Основные причины популярности UNIX.
Каковы же причины популярности этой операционной системы ? В первую очередь это более чем трех десятилетний возраст. За этот период она полностью прошла проверку временем. Во вторых код системы практически полностью написан на языке высокого уровня С, что сделало ее простой для понимания, внесения изменений и переноса на другие аппаратные платформы. Некоторые из версий UNIX поставляются вместе с исходными текстами, однако даже несмотря на то что большинство UNIX поставляется в виде бинарных файлов, система все равно остается легко расширяемой и настраиваемой. Так же следует отметить тот факт что UNIX в изначально создавалась как мноВнгоВнпольВнзоВнваВнтельВнская и многозадачная система ориентированная в первую очередь на выполнение серверных функций. Следует отметить и тот факт что UNIX практически изначально создавалась как сетевая операционная система (даже графическая оболочка UNIX система X Window является полностью сетевой), что позволило ей занять лидирующие позиции на рынке серверов для Интернет приложений и дало мощные встроенные средства удаленного администрирования. Не маловажную роль в популярности UNIX сыграла ее единая иерархическая файловая система с унифицированным доступом не только к файлам данных но и к аппаратным ресурсам таким как диски, терминалы, принтеры, сеть, память и.т.п.
Структура операционной системы.
В задачу операционной системы UNIX входит непосредственное управление ресурсами компьютера, распределение их между пользователями, скрывая от последних внутреннюю архитектуру аппаратного обеспечения, путем предоставления унифицированного интерфейса доступа к аппаратным ресурсам. К аппаратным ресурсам компьютера относится в первую очередь вычислительные ресурсы процессора, память и дисковое пространство, а также ряд периферийных устройств, таких как накопители на магнитных лентах, принтеры, терминалы, сетевые адаптеры и.т.п. Самый общий взгляд позволяет увидеть двухуровневую модель системы в том виде как она представлена на рис. 1.1.
Рис 1.1
В центре находятся аппаратные ресурсы компьютера с которыми непосредственно взаимодействует ядро операционной системы изолируя прикладные программы пользователя от особенностей аппаратной архитектуры. Ядро имеет определенный минимальный набор услуг представляемых прикладным программам. В первую очередь это операции ввода-вывода (открытие, закрытие, чтение, запись и управление файлами), создание и управление процессами, организация синхронизации и обмена данными между процессами, управление памятью (реальной и виртуальной).
Второй важнейшей функцией выполняемой ядром является защита операционной системы от разрушения со стороны пользовательских программ и реализация механизмов защиты данных в многопользовательской среде. Все пользовательские приложения пользуются услугами ядра посредством системных вызовов.
На втором уровне находятся приложения, как пользовательские, обеспечивающие интерфейс с пользователем так и системные, управляющие работой системы. Несмотря на различные выполняемые задачи, схемы их взаимодействия с ядром одинаковы.
Задачи выполняемые ядром операционной системы
Остановимся более подробно на структуре ядра операционной системы. Функционально его можно представить состоящим из трех основных подсистем: подсистемы управления процессами и памятью, подсистемы ввода-вывода и файловой подсистемы. Все современные микропроцессоры поддерживают виртуальную память, защищенный и многозадачный режим работы. Последний подразумевает выделение кванта процессорного времени определенной задачи с последующим переключением на другую задачу
Каждая задача имеет идентификатор уровня защиты, некоторые команды из системы команд процессора могут выполняться на любом уровне защиты, но есть привелигированные команды выполнение которых возможно лишь задачей имеющей нулевой уровень привилегии. Ядро операционной системы работает на нулевом уровне защиты, только оно имеет непосредственный доступ к физической памяти, системным регистрам процессора и портам ввода вывода. Пользовательские программы общаются с ядром посредством системных вызовов, представляющих собой команду приводящую к переключению процесса в контекст ядра, передачей параметров ядру. Затем ядро проверяет корректность параметров, права пользовательского процесса на возможность выполнения данного системного вызова и лишь после этого переходит к непосредственному выполнению всех низкоуровневых действий необходимых для исполнения пользовательского запроса. Благодаря этому достигается защита критически важных данных ядра от случайного или преднамеренного разрушения со стороны пользователя.
Второй из важнейших функций ядра является обработка исключительных ситуаций возникающих в результате работы операционной системы и представляющим собой програмные прерывания. К последним относятся ошибки защиты (на пример попытка прикладной программы получить доступ к портам ввода-вывода или чужой области памяти), ошибки в работе оборудования, а также системные события возникающие при нормальной работе операционной системы. Некоторые из исключительных ситуаций приводят к аварийному завершению системы (ошибки оборудования или исключительная ситуация возникшая во время обработки исключительной ситуации), некоторые к аварийному завершению пользовательской программы при этом возможен сброс на диск в файл образа процесса вызвавшего исключительную ситуацию c целью дальнейшего анализа отладчиком, а некоторые просто жизненно необходимы для нормального функционирования операционной системы (одна из таких исключительных ситуаций будет рассмотрена ниже).
Подсистема управления процессами.
Запущенная на выполнение программа порождает в системе один или больше процессов. Подсистема управления процессами отвечает за создание и уничтожение процессов, распределения ресурсом между процессами, синхронизацю и межпроцессное взаимодействие. Так как в данный момент времени на одном процессоре может выполняться лишь одна задача ядро операционной системы в зависимости от приоритета задачи выделяет ей определенный квант процессорного времени по истечению которого происходит переключение на следующую задачу. При этом исключается возможность захвата всех ресурсов процессора одной задачей и создается эффект параллельного выполнения нескольких задач.
Подсистема управления памятью.
Подсистема управления памятью управляет выделением, размещением и освобождением памяти для прикладных задач. Прикладные программы никогда не используют физическую память напрямую, т.к. все современные операционные системы реализуют так называемую виртуальную память объем которой может превышать объем физической памяти. При этом задействуется механизмы страничной адресации памяти в которых все виртуальное адресное пространство разделяется на небольшие блоки тАУ страницы. Размер страницы варьируется в зависимости от архитектуры, для архитектуры HP PA-RISC это 2К, для Intel это 4K. Каждая страница имеет специальные атрибуты которые определяют права доступа к ней, факт присутствия в физической памяти, частоту обращений и.т.п. Преобразование из виртуального адреса в физический осуществляется аппаратно. Данная схема адресации дает ряд неоспоримых преимуществ которые используются всеми современными операционными системами. А именно: возможность экономии физической памяти путем совместного использования одних и тех же страниц виртуальной памяти разными процессами, реализация разделяемой памяти, а также возможность использования вторичных устройств в качестве устройств памяти что позволяет задачам задействовать виртуальной памяти больше чем есть реально физической памяти в системе. Реализуется это следующим образом: в случае нехватки физической памяти, ядро сбрасывает на внешний носитель (как правило диск) страницы к которым наиболее долго не было обращений, а так же при обращении к странице которой реально нет в физической памяти процессор генерирует исключительную ситуацию обработчик которой загружает страницу обратно с внешнего носителя в физическую память. Этот процесс носит название пейджинг или свопинг.
Файловая подсистема.
Файловая подсистема ядра предоставляет унифицированный интерфейс для доступа к данным находящимися на дисках и других внешних устройствах. Она обеспечивает контроль прав доступа к файлам со стороны прользователя т.к. каждый файл имеет атрибуты доступа определяющие права доступа к нему со стороны определенного прользователя или групп пользователей.
Подсистема ввода-вывода.
Подсистема ввода-вывода обслуживает запросы файловой подсистемы и подсистемы управления процессами для доступа к периферийным устройствам (сетевые адаптеры, диски, терминалы тАж). Также она обеспечивает буферизацию и кеширование данных и взаимодействует с драйверами устройств тАУ специальными модулями ядра непосредственно работающими с внешними устройствами.
2. Шеллы и основные команды HP-UX.
2.1.1 Общее знакомство с шелами
2.1.2 Смена шела
2.2.1 Bourne Shell
2.2.1.1 Основные возможности Shell.
2.2.1.2 Shell скрипты
2.2.1.3 Основы программирования на языке shell
2.2.1.4 Некоторые специальные команды
Общее знакомство с шелами
Шелл это интерфейс между операционной системой и пользователем. Шелл интерпретирует пользовательский ввод и дает указания операционной системе выполнить те или иные действия. Шелл можно также рассматривать как язык программирования.
Bourne Shell. Это самый старейший из шелов который был написан Стэфаном Борном в Лаборатории Беэлла. Этот шелл является шелом по умолчанию для HP-UX пользователей и долгое время был стандартом де факто.
Bourne Shell не имеет в своем арсенале ни интерактивных возможностей ни сложных программных конструкций в отличии от С и Korn шеллов.
C Shell. Этот шел был разработан Биллом Джоем в Калифорнийском Университете Беркли. Его синтаксис имеет сходство с языком программирования С. Он также имеет интерактивный интерфейс например историю команд и раскрытие имен файлов.
Korn Shell. Он является относительно новым шелом разработанным Девидом Корном в Лаборатории Бэлла и является вверх совместимым с большинством возможностей Bourne Shell. Так же как и С shell он имеет интерактивные возможности, но выполняется быстрее имеет расширенные возможности редактирования командной строки.
POSIX shell. Этот шелл базируется на стандарте определенном в Portable Operation System Interface (POSIX) тАУ IEEE P1003.2. Этот стандарт был разработан для прикладных и системных программистов. Он фактически определяет стандарт на интерфейс операционной системы. Большинство возможностей POSIX Shell очень сильно схожи с аналогичными возможностями Korn Shell-a. Мы будем рассматривать оба этих шела едино, указывая лишь небольшие различия между ними. POSIX Shell имеет тоже имя что и Bourne Shell поэтому он помещен в /usr/bin/posix директорию в отличии от Bourne Shell, который находится в директории /usr/bin.
Key Shell. Это оболочка для Kourn Shell-a разработанная фирмой Hewlett-Packard. Она позволяет использовать меню и онлайн помощь помогая в построении команд и выполнению ряда часто встречаемых задач, таких как просмотр, редактирование и печать файлов, просмотр содержимого директории и.т.п. Построена она таким образом что пользователь может сам в дальнейшем
расширять ее возможности.
Bash. Название этого шела расшифровывается как Bourne Again Shell. Он бы разработан консорциумом Free Software Foundation и несмотря на то что по умолчанию он отсутствует в стандартной поставке HP-UX 10.20, в следствии своих мощных функциональных возможностей он пользуется огромной популярностью среди пользователей и администраторов HP-UX. Его интерпретатор команд совместим с Bourne Shell. Также он вместил в себе полезные возможности Korn C шеллов. Он разрабатывался в сооответствии со спецификациями IEEE POSIX Shell and Tools specification (IEEE Working Group 1003.2).
2.1.2 Смена шела
Для того чтобы определить Ваш системный шелл достаточно сразу после логина выполнить команду:
echo $SHELL
она показывает содержимое переменной SHELL в которую система прописывает Ваш шелл установленный по умолчанию. Для временной смены шела достаточно выполнить запуск желаемого шела в текущем:
$ ksh запуск Kourne Shell
$ ps печать списка процессов
PID TTY TIME COMMAND
12320 pts/2 0:00 sh Bourne shell
12322 pts/2 0:00 ksh Korn Shell
12323 pts/2 0:00 ps
$ exit выход из Korn Shell-a
Для постоянной смены шела устанавливаемого системой после входа (login shell) необходимо выполнить команду:
chsh <ваш_логин> <полное_имя_шела>
Замечание: список шелов доступных в системе для пользователей находится в файле /etc/shells
Bourne Shell.
2.2.1.1 Основные возможности Shell.
Запуск шелла и выход из шелла
Для запуска Bourne Shell достаточно ввести sh в текущем шеле. Выход из шела возможен либо по команде exit либо введя в терминале символ коца файла Ctrl-D.
Последовательное выполнение команд.
Несколько команд можно последовательно выполнять разграничивая точкой с запятой. Например, фрагмент
$ who
$ ps тАУef
$ ls тАУl
и
$ who; ps тАУef; ls -l
дадут полностью одинаковый результат.
Фоновое выполнение.
Запуск программы в фоновом режиме (без блокировки текущего шела) достигается добавлением в конец команды знака &
Перенаправление ввода-вывода.
Каждая запущенная программа имеет три ассоциированных канала: стандартный ввод, стандартный вывод и стандартный канал диагностики ошибок. По умолчанию стандартный ввод закреплен за клавиатурой а стандартный вывод и канал ошибок закреплены за монитором. Однако шелл позволяет связать эти каналы с файлами абсолютно прозрачно для выполняемой программмы, т.к. изменения вывода и ввода осуществляются на системном уровне. Примеры перенаправлений ввода-вывода:
Символ | Функция | Пример |
< | Перенаправление ввода из файла | program < in_file |
> | Перенаправление вывода в файл | program > out_file |
>> | Перенаправление вывода в файл с добавлением | Program >> out_file |
Пайпы. Две или более программ могут быть объединены таким образом что результат одной программы попадет на вход другой. При этом данные от одной программы к другой следуют через програмный канал, например:
program1 | program2 | program3
или более реалистичный пример:
ls тАУl /etc | more
Примечание: пайпы всегда работают лишь в одном направлении тАУ со стандартного выхода одной к стандартному входу другой программы.
Расширение имен файлов.
В целях уменьшения количества набираемых символов при вводе имен файлов шел поддерживает метасимволы. Нпример для того чтобы вывести листинг всех файлов в текущей директории имена которых начинаются с буквы a достаточно воспользоваться командой ls тАУl a*
ниже приведена таблица основных метасимволов
Метасимвол | Описание |
* | Означает любой символ в любом количестве |
~ | Означает путь к домашнему каталогу |
? | Любой символ в количестве один или больше |
[ тАж ] | Равенство любого одного из символов заключенных в скобки. Пара символов разделенная знаком минус означает любой символ из промежутка между ними. Например [a-zA-Z] тАУ любаялатинская буква |
2.2.1.5 Shell скрипты
Выполнение скриптов.
Несколько команд обьедененных одной последовательностью выполнения называется скриптом. Например последовательное выполнения команд, пайпы являются простейшими скриптами. Обычно команды из которых состоят скрипты сохраняют в файлах. Для запуска скрипта можно воспользоваться двумя методами:
sh <имя_файла_скрипта>
или установить атрибут выполняемости на файл командой
chmod +x <имя_файла_скрипта>
После чего можно выполнять скрипт:
./<имя_файла_скрипта>
Вывод текста.
Для формирования вывода текстовой информации в скриптах используют команду
echo тАЬстрокатАЭ
Файл .profile .
Каждый раз во время входа в систему Bourne Shell автоматически запускает файл .profile (скрипт) находящийся в вашей домашней директории. Этот скрипт устанавливает тАЬокружениетАЭ в котором Вам предстоит работать. Это различные переменные окружения отвечающие за вид системной подсказки, путь поиска исполняемых файлов, тип терминала и.т.п. Приведем список основных переменных окружения.
В· PATH устанавливает путь поиска исполняемых файлов и представляет собой набор директорий разделенных двоеточием
В· MAIL определяет имя файла почтового ящика для уведомления о приходе новой электронной почты
В· MAILCHECK параметр показывающий как часто (в секундах) следует проверять почтовый ящик на предмет прихода новой почты
В· HOME определяет домашний каталог (каталог по умолчанию). Команда cd без параметров выполняет переход в этот каталог.
В· PS1 основная системная подсказка (по умолчаию $)
В· PS2 вторичная системная подсказка (по умолчанию >)
В· SHELL имя логин шелла пользователя
В· TERM тип терминала пользователя
В· EDITOR имя текстового редактора по умолчанию
Устанавливать переменные окружения можно по разному. Например команды
PATH=/bin:/usr/bin:/usr/sbin:/usr/contrib/bin:/usr/local/bin
и
PATH=/bin:/usr/bin:/usr/sbin
PATH=$PATH: :/usr/contrib/bin:/usr/local/bin
полностью эквивалентны. Для того чтобы эти переменные вошли в системное окружение (кроме шела, стали доступны и другим программам) необходимо выполнит команду
export <имя_переменной>
Комментарии.
Текст следующий за символом # рассматривается шелом как комментарий и не оказывает никакого влияния на работу скрипта.
Основы программирования на языке shell
Параметры.
В дополнение к стандартным параметрам шела можно создавать свои параметры, кторые затем можно использовать в командах. Например
$ x=test
$ echo $x
test
$ aaa=/
$ ls $aaa
cdrom home nsmail tcb var
SD_CDROM dev lib opt tmp
TT_DB etc lost+found sbin tmp_mnt
Bin export net stand usr
При включении параметров в строку или в выражение знак $ должен предшествовать параметру. Также необходимо пользоваться следующими правилами:
${parameter} значение параметра заключенного в скобки будет использовано в выражении. Скобки {} используются когда за параметром следуют буквы или цифры не относящиеся к парамаметру. Например если значение параметра xxx равно test то значение выражения ${xxx}123 будет равняться test123
${parameter:-word} если параметр установлен и не пустой то результатом выражения будет являться значение параметра, в противном случае в результате будет использовано значение параметра word. Например: ${xxx:-/usr/bin/sh}
если xxx пустой то результатом выражения будет являться строка /usr/bin/sh
${parameter:=word} если параметр неустановлен или пустой, тогда значение word будет результатом выражения.
${parameter:+word} если параметр установлен и не пустой, тогда результатом выражения является word, в противном случае результат пустой.
Аргументы командной строки.
Когда Вы запускаете на выполнение программы, Вы можете передавать ей один или больше аргументов. Шелл скрипты имеют доступ к этим аргументам посредством параметров $0, $1, $2 тАж$9. Если аргументов больше девяти, их значения помещаются в буффер и могут быть доступны с использованием команды shift которая будет обсуждаться ниже. Параметр $0 всегда принимает значение имени выполняемого файла, $1 тАУ первого аргумента командной строки, $2 тАУ второго, и.т.п.
Количество агрументов командной строки всегда можно узнать проанализировав параметр $#. В том случае если Вам необходим один параметр содержащий все аргументы командной строки разделенные пробелом нужно воспоьзоваться параметром $*.
Для получения доступа к аргументам с номером больше девяти необходимо воспользоваться командой shift. После очередного выполнения команды shift происходит сдвиг на один элемент в буффере параметров в результате которого значение параметра $2 получает параметр $1, значение параметра $3 получает $2, и.т.п. Используя цикл (цыклы будут рассвотрены ниже) в сочетании с командой shift можно получать доступ ко всем аргументам командной строки с номерами превышающими 9.
Квотинг.
Очень часто случаются ситуации когда необходима особая трактовка тех символов которые шелл воспринимает как спец символы. Например случай когда строку текста включая пробелы нужно передать как один аргумент или знак $ должен не быть воспринят как указатель на параметр. Для этих целей используется квотинг (quoting).
Например символ бекслэша ( \ ) можно использовать для квотинга символа $.
$ param=aaa
$ echo $param
aaa
$ echo \$param
$param
В сочетании с бекслэшем для квотинга можно использовать двойные кавычки. Например:
echo "$param is a \"new directory\""
aaa is a "new directory"
При этом знак $ внутри двойных кавычек интерпретируется как указатель на параметр а бэкслэш используется для тАЬэкранированиятАЭ внутренних кавычек.
Одинарные кавычки также можно использовать для квотинга но в отличии от двойных они тАЬэкранируюттАЭ все что находится внутри них. Разница сразу становится понятной после замены в предыдущем примере двойных кавычек однираными:
$ echo '$param is a \"new directory\"'
$param is a \"new directory\"
Подстановка команд.
Символ обратного ударения ( ` ) используемый в скриптах указывает на подстановку команд. Это подразумевает что результат вывода команды подставляется в шелл как параметр. Нпример:
$ echo "The current date is `date`"
The current date is Sat Jan 6 04:16:35 GMT 2001
или
$ users=`who`
$ echo "Users currentrly logged in the system:\n $users"
Users currentrly logged in the system:
root console Jan 6 03:57
roman pts/0 Jan 5 23:12
Условия.
Очень часто случаются ситуации при написании скриптов когда необходимо выполнять те или иные команды в зависимости от конкретных условий.
Например, нужно отсортировать файл, а в случае его отсутствия вывести сообщение об ошибке. На этот случай шелл имеет условный оператор, и указанная задача решается с его использованием следующим образом:
if test тАУf $1
then
sort $1
else
echo тАЬfile $1 doesnтАЩt existтАЭ
fi
Условный оператор имеет следующий синтаксис:
if <список_комманд1>
then <список_комманд2>
elif <список_комманд3>
then <список_комманд4>
тАж.
else <список_коммандN>
fi
Оператор ifпроверяет статус выполненной команды (в данном примере test тАУf)
И в случае успеха (программа возвращает 0) выполняет команды стоящие после then, в противном случае выполняются команды else/elif.
Наиболее часто используемой командой в оператореусловия является команда test. Она имеет множество опций, полный список которых можно получить обратившись к ее документации выполнив команду man test.Очень часто вместо команды test используют команду [ которая является ее фунуциональным аналогом. Здесь приводится лишь краткий список основных опций команды test.
-r file возвращает успех если файл существует и доступен для чтения.
-w file возвращает успех если файл существует и доступен для записи.
-x file возвращает успех если файл существует и выполняемый.
-f file возвращает успех если это регулярный файл.
-d file возвращает успех если это директория.
-c file возвращает успех если это специальный файл.
-s file возвращает успех если файл имеет ненулевой размер.
-h file возвращает успех если это симлинк.
-z s1 возвращает успех если длинна строки s1 нулевая.
-n s1 возвращает успех если длинна строки s1 ненулевая.
s1 = s2 проверка двух строк на равенство.
s1 != s2 проверка двух строк на неравенство
s1 возвращает успех если строка s1 непустая
n1 -eq n2 Алгебраическая проверка двух чисел n1 и n2 на
равенство. Помимо тАУeq есть еще ряд опций для алгебраического
сравнения такие как -ne, -gt, -ge, тАж
Все вышеперечисленные условия могут обьеденяться с использованием логических операторов:
! отрицание
-a Бинарный И
-o Юинарный ИЛИ (-а имеет приоритет больший чем тАУо)
( expr ) Группировка выражений скобками
Ввод данных.
Для ввода иданных в скрипт можно воспользоваться командой
read [parameter тАж]
которая в качестве аргументов принимает список из одного или более параметров.
Примечание: знак $ перед именем параметра в команде read ставить не нужно.
Циклы.
Очень часто при составлении скриптов простого последовательного выполнения бывает недостаточно. Необходимы механизмы которые позволяли бы выполнять команды с изменяющимися параметрами. Для этих целей шелл предоставляет в распоряжение три цикличекие конструкции: циклы for,while и untill.
Цыкл for
Этот тип циклов позволяет выполнять один и тот же набор команд каждый раз с новыми значениями полученными из списка параметров. Он имеет следующий формат:
for parameter [ in wordlist ]
do command-list
done
где parameter это любое имя параметра, wordlist тАУ один или несколько значений последовательно присваиваемых параметру, command-list тАУ набор команд выполняемых при каждом проходе цикла. wordlist может быть либо просто набором аргументов разделенных пробелом, либо командой шелла которая генерирует сама аргументы. Например следующий скрипт:
for i in 1 2 3 4 5
do
if mkdir $i
then
echo тАЬdirectory $i was createdтАЭ
fi
done
создает последовательно директории с именами 1 2 3 4 5 и в случае успешного создания директории выдает сообщение. Следующий скрипт:
for i in `ls a*`
do
cp $i /tmp
echo тАЬ$i was copiedтАЭ
done
копирует все файлы начинающиеся с буквы a из текущего каталога в каталог /tmp.
Цикл while
while command-list1
do command-list2
done
этот цикл запускает команды из списка command-list1, и если последняя команда из списка выполнилась успешно (код возврата равен 0) то начинают выполняться команды из списка command-list2, в противном случае цикл заканчивается. Цикл из следующего примера:
while [ -r $1 ]
do
echo тАЬprocessing $1тАЭ
cat $1 >> summary
shift
done
по очереди считывает аргументы командной строки, в случае когда в текущем каталоге присутствует файл доступный на чтение с именем совпадающим с этим аргументом, содержимое этого файла дописывается к файлу с именем summary. В противном случае, скрипт прекращает свою работу.
Цикл util
until command-list1
do command-list2
done
конструкция этого цикла полностью аналогична циклу while за исключением того что тело цикла (набор команд command-list2) выполняется как минимум один раз не зависимо от успешности выполнения условия цикла (набор команд command-list1).
Оператор case
Оператор case является расширением стандартного условного оператора if. Если есть условие при котором может реализовываться множество вариантов то вместо серии операторов if лучше использовать один case.
case parameter in
pattern1 [ | pattern2 тАж] ) command-list1 ;;
pattern2 [ | pattern3 тАж] ) command-list2 ;;
тАж
esac
шаблоны pattern определяют варианты параметра parameter. При совпадении параметра с одним из шаблонов будет выполнен соответствующий список команд command-list. В квадратных скобках ([ pattern2тАж] ) указаны дополнительные варианты разделенные символом ( ) которые может принимать parameter помимо основного. Заканчивается список шаблонов скобкой. Более понятней структура этого оператора станет после рассмотрения примера:
case $i in
-d | -c ) mkdir dir1
echo тАЬdirectory dir1 was createdтАЭ ;;
-r ) rmdir dir1
echo тАЬdirectory dir1 was removedтАЭ ;;
* ) echo тАЬinvalid optionтАЭ ;;
esac
В этом примере скрипт получив при запуске один из аргументов тАУd или тАУc попытается создать директорию с именем dir1 , получив аргумент тАУr попытается ее стереть. Во всех остальных случаях (шаблон *) он выдаст предупреждение о неправильном аргументе.
Примечание: обратите внимание на то что порядок следования гшаблонов в операторе case имеет большое значение. Так если строку
* ) echo тАЬinvalid optionтАЭ ;;
поставить в самое начало, то на ней будет все время терминироваться скрипт.
Команда . (точка)
Каждый раз когда Вы запускаете шелл программы, создается еще одна копия шелла в которой они выполняются. Поэтому если Вы написали шелл скрипт, то все переменные тАЬживуттАЭ только во время выполнения скрипта. Если вы хотите чтобы все переменные из шелл программы были в вашем текущем окружении запускать скрипт нужно в текущем шеле, это достигается использованием команды . (точка).
. scriptname
Команда eval
eval [arg ..]
Аргументы читаються и соединяются в одну команду. Затем эта команда выполняется шеллом и статус выхода команды возвращается как результат команды eval. Если аргументы в команде отсутствуют или пустые то команда возвращает нулевой статус.
В качестве примера рассмотрим два скрипта:
d=тАЩdate &тАЩ ; $d
и
d=тАЩeval date &тАЩ ; $d
первый из них не выполнится так как команда date воспримет символ & как аргумент а не как признак запуска в фоновом режиме, в результате чего первый скрипт не выполнится в отличии от второго.
Использование метасимволов.
Во всех конструкциях циклов и операторе case возможно использование метасимволов. Например скрипт из примера оператора цикла for
for i in `ls a*`
do
cp $i /tmp
echo тАЬ$i was copiedтАЭ
done
можно переписать в более простом виде
for i in a*
do
cp $i /tmp
echo тАЬ$i was copiedтАЭ
done
результат будет один и тот же.
2.3.1 Некоторые специальные команды
Разделители && и
Это условные разделители. При разделении двух команд с помощью && вторая команда выполнится лишь в том случае когда первая завершится успешно. При разделении команд с помощью || вторая выполнится лишь тогда когда первая закончилась неуспешно (код возврата не равен нулю).
Например при выполнении скрипта:
test тАУd /usr/tools && cd /usr/tools
test тАУd /usr/tools || echo тАЬdirectory doesnтАЩt existтАЭ
вход в директорию /usr/tools будет произведен только при ее наличии, в противном случае будет выдано сообщение о ее отсутствии.
Определение функций
Для сокращения обьема шелл программ и упрощения их понимания и сопровждения шелл допускает введение и использование функций. Для опредения функции используется следующий синтаксис:
name () { list; }
где name тАУ это имя функции, а list тАУ список команд из которых состоит тело функции. Ниже приведен пример функции возвращающей 0 если аргумент переданный ей является директорией и 1 в противном случае.
dir_test () {
if [ -d $1 ]
then
echo тАЬ$1 is a directoryтАЭ
return 0
else
echo тАЬ$1 is not directoryтАЭ
return 1
fi;
}
вызов функции осуществл
Вместе с этим смотрят: