Администрирование
SAMBA с авторизацией в домене с win2003 сервером
Написал Алхимик   
Вторник, 12 Июль 2005

Задача:

      Организация файлового сервера
      Авторизация пользователей через домен контроллер
    

Дано:

    Red Hat 9.0
    Samba 3.0.13
    DC win 2003 server


Вступление.

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


Основная часть.

      Первым делом устанавливаем самбу . Решено было использовать последню
версию 3.0.13Установлено все это было из стандартного RPM пакета. Думаю с этим
сложностей ни у кого не возникает, док по данному вопросу полно и
потому начнем сразу править конфиг самбы. Ниже приведен окончательный работающий
конфиг, может там и есть что лишнее, но после того как все заработало я убирать
оттуда ничего не стал.



[global]

   realm = bryusov.iasnet.ru
# Workgroup = имя NT-домена (или рабочей группы):
   workgroup = DOMAIN 

# NetBIOS-имя, под которым будет виден сервер остальным машинам сети.
   netbios name = NAU

# Комментарий, появляющийся рядом с именем машины в "Сетевом окружении" Windows.
   server string = Samba Server

# Следующий параметр влияет на безопасность. Hosts allow разрешает машинам с
# указанными IP-адресами присоединяться к Samba-серверу.
   hosts allow = 172.18. 172.17.  127.

# если подставить %m то для каждой машины  подключенной к Samba-серверу будет
# использоваться свой log-файл.
   log file = /var/log/samba/log.smbd  

#это кому скока не жалко            
   max log size = 500   

#определяет, каким образом будет осуществляться проверка пароля (нам надо через
# DC )                                         
   security = domain

# Параметр Password server используется только совместно с опцией
# security = domain.
   password server = 

#для репликации всех доменов входящих в траст с вашим доменом
   allow trusted domains = yes       

#  включаем  поддержку шифрованных паролей.
   encrypt passwords = yes

# Используя следующий параметр можно создать отдельную конфигурацию для
# каждой машины домена.
# Вместо пары символов %m при входе подставляется NetBIOS-имя машины.
# Я Такого не делал хотя поэксперементровать можно.
# include = /usr/local/samba/lib/smb.conf.%m

#данные строчки можно не включать в работающий конфиг они определяют место
#хранения , порядок обновления Unix паролей и какой программой все это производится
  smb passwd file = /etc/samba/smbpasswd
   unix password sync = Yes
   passwd program = /usr/bin/passwd %u
   passwd chat = *New*UNIX*password* %n\n *ReType*new*UNIX*password* %n\n *passwd:*all*authentication*tokens*updated*successfully*

# В документации  говорится, что с помощью этого параметра
# можно повысить производительность Samba-сервера.
  socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192

#по дефолту слушаются все интерфейсы, здесь можно указать конкретно
  interfaces =

#строчки которых не было в стандартном конфиге и были добавлены руками для
#pепликации NT-юзеpов:

  winbind uid = 10000-20000
  winbind gid = 10000-20000
  winbind enum groups = yes
  winbind enum users = yes

#описываем шары

[FILES]
   comment = share
   path = /share/FILES
   public = no
   writable = yes
   valid users = DOMAIN\users
   create mask = 0744

#натсройка кирилицы по желанию




Все с конфигом самбы закончили, далее привожу конфиг /etc/krb5.conf


[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log

[libdefaults]
ticket_lifetime = 24000
default_realm = PDC.DOMAIN.NAME.RU
dns_lookup_realm = false
dns_lookup_kdc = false

[realms]
DOMAIN.NAME.RU = {
  kdc = pdc.domain.name.ru:88
  admin_server = kerberos.domain.name.ru:749
  default_domain = domain.name.ru
}

[domain_realm]
.domain.name.ru = DOMAIN.NAME.RU
domain.name.ru = DOMAIN.NAME.RU

[kdc]
profile = /var/kerberos/krb5kdc/kdc.conf

[appdefaults]
pam = {
   debug = false
   ticket_lifetime = 36000
   renew_lifetime = 36000
   forwardable = true
   krb4_convert = false




Все остальное оставлено без изменений.

Теперь заводим самба сервер в домен, делаем со стороны домен контролера
двусторонние доверительные отношения, запускаем getent group и видим что
все  работает.

Вот и все надеюсь полезной инфы достаточно для быстрой и эффективной
настройки файл сервера.

(0 Комментарии)
 
ПРОГРАММИРОВАНИЕ НА shell (UNIX) (Учебное пособие)
Написал Алхимик   
Вторник, 12 Июль 2005
 

		 ПРОГРАММИРОВАНИЕ НА shell (UNIX)

		       (Учебное пособие)



(с) А. Соловьев



			 1. ВВЕДЕНИЕ



     Среди операционных систем особое место занимает Unix.

     Беспрецедентным  является  то,  что  ОС  Unix может работать

практически  на  на  всех  выпускаемых  платформах.  UNIX  -  это

стандарт  де  факто  открытых  и  мобильных опрерационных систем.

(поскольку название UNIX запатентовано компанией AT&T - различные

юниксы  называются  различно:  SCO  UNIX,  BSDI,  Solaris, Linux,

DG/UX, AIX и т.д.).

     Это  не  только  многозадачная,  но  и многопользовательская

система.  Она обеспечивает современный пользовательский интерфейс

на  базе системы  X Window и межмашинную связь на базе протоколов

TCP/IP и т.п.

     ОС Unix была создана Кеном Томпсоном и Деннисом Ритчи в Bell

Laborotories  (AT&T).  Широко распространяться Unix/v7 (версия 7)

начала  в  79  - 80-м годах. Вручение создателям Unix в 1983 году

Международной   премии   А.Тьюринга  в  области  программирования

ознаменовало  признание  этой  системы  мировой научной (computer

science) общественностью. Что также беспрецедентно.

     Сколько  операционных  систем взошло и зашло на компьютерном

небосклоне за время существования UNIX!



     ОС  Unix  стоит  на  трех  китах: язык Си, файловая система,

командный  язык. В дальнейшем к ним добавились система X Window и

протоколы TCP/IP.

     Язык  Си,  на  котором написана сама операционная система, с

одной  стороны,  сочетает  в себе свойства языка высокого уровня:

описание  типов, программные структуры if, for, while и т.п., а с

другой   -  содержит  средства,  присущие  обычно  языкам  уровня

ассемблера:    регистровые   переменные,   адресную   (ссылочную)

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

т.п.



		     2. ФАЙЛОВАЯ СИСТЕМА



     Файловая  система  ОС Unix имеет иерархическую (древовидную)

структуру. В вершинах дерева находятся каталоги (используют также

термины - справочники, директории), содержащие списки файлов. Эти

файлы  в  свою  очередь  могут  быть  либо снова каталогами, либо

обычными  файлами,  либо  специальными  файлами,  представляющими

различные утройства ввода-вывода.



			  /

			  |

   -----------------------------------------------------------

  |     |     |    |    |    |    |                 |    |     |

bin    boot  dev  etc  lib  mnt  sys    .   .   .  tmp  unix  usr





     Kорневой каталог имеет имя "/". Он обычно содержит каталоги:



     bin - для наиболее используемых команд;

     usr  -  каталоги  и  обычные  файлы,  содержащие информацию,

привлекаемую при решении задач пользователя;

     dev  -  для  специальных  файлов,  представляющих устройства

(дисплеи, диски...);

     etc - для хранения команд администратора системы;

     lib - важнейшие библиотеки;

     mnt  -  для  подключения  (примонтирования)  новых  файловых

систем;

     sys - средства для изменения конфигурации системы;

     tmp - для хранения временных файлов;

     usr  -  каталоги  и  обычные  файлы,  содержащие информацию,

привлекаемую при решении задач пользователя.



А также обычные (выполняемые) файлы:

     unix - ядро;

     boot - загрузчик.



     Полные имена файлов будут: /bin, /usr, ..., /unix, /boot.



     В   свою  очередь  эти  каталоги  могут  содержать  каталоги

следующего   уровня.  Например,  каталог  "usr",  кроме  прочего,

содержит каталоги:

     bin - хранит дополнительные команды;

     games - игры;

     include - хранит фрагменты системных программ;

     lib - хранит дополнительные библиотеки.

полные имена этих файлов будут:



     /usr/bin   /usr/games   /usr/include   /usr/lib



     Если  в  каталоге  "/usr/include"  содержится каталог "sys",

который  в  свою  очередь, содержит каталог "conf", то полное имя

файла "conf" будет



     /usr/include/sys/conf



     Формальным  признаком  полного  имени  является  то, что оно

начинается со слэша ("/").

     Относительное  имя  начинается  не  с  "/",  и определят имя

относительно  своего местоположения. Если (пользовател?) в данный

момент  находится в директории /usr файловой системы, то он может

обратиться к этому же файлу по относительному имени



	 include/sys/conf



     Есть  два  специальных  имени:

     .   -  это "имя" текущего директория  и

     ..  -  это "имя" родительского директория (т.е. директория,

находящегося на ступеньку выше данного на пути к корню).

     В  качестве  имени  файла  как  правило может использоваться

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

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

использованнии в имени требует специального экранирования. (Лучше

не  пользоваться  специальными  символами  в  именах - иногда это

может привести к сложностям в обращении к таким именам, поскольку

спецсимволы могут иметь в shell некоторый специальный смысл).

     В  ряде  систем  длина  имени  ограничивается 14-ю символами

(этого  ограничения  желательно  придерживаться для переносимости

файлов), однако в других системах допускаются более длинные имена

- например, до 256 символов.

     В   общем   случае   не  явлются  обязательными  и  какие-то

расширения  в  именах.  Хотя ряд команд требуют наличия некоторых

фиксированных  расширений  в именах, например расширение ".с" для

исходных файлов для Си-компилятора.

     КСТАТИ.  В  ОС UNIX большие и маленькие буквы воспринимаются

как  различные,  поэтому  "FILE",  "file"  и  "File"  -  это  три

различных имени!



     ВАЖНОЕ  ЗАМЕЧАНИЕ.  Отдельные  части  файловой системы могут

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

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

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

монтируются  (присоединяются)  в единую файловую систему командой

mount  (обычно  это  функция  администратора системы), после чего

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

в имени никак не отражается устройство, на котором файл находится

или создается (т.е. никаких "A:").



     Командный  язык ОС Unix - shell оперирует с командами. Более

подробно о нем разговор далее, а пока рассмотрим несколько команд

работы с файловой системой.

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



	    ls -l /usr



     где ls - имя команды; -l - флаг, говорящий о том, что выдача

должна  быть  в длинном формате; /usr -имя каталога, который надо

echo. На экран будет выведено



    drwxrwxr-x  2  root  2048  nov 3  12:11  bin

    -rwxr--r--  1  root   861  may 11 20:11  boot

    drwxrwxr-x  2  root  1024  jan 9  11:55  dev

    drwxrwxr-x  1  root  4096  may 11 20:11  dos

    drw-r--r--  3  root  4096  nov 17 12:01  include

    drwxr-xr-x  7  root  480   nov 17 12:30  lib



     Первая  строка  означает, что это каталог (d-directory), где

первая триада "rwx" разрешает владельцу каталога: r - читать, w -

писать  и  х  - выполнять (более точно, для файлов типа каталог w

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

него,  а  х разрешает доступ к файлам каталога); членам группы, в

которую  входит  владелец,  также  разрешены  все  три  операции.

Последняя  триада  отражает  права  доступа прочих пользователей,

которым  разрешено  только читать и выполнять (запрещено писать в

этот файл, т.е. изменять содержимое каталога).

     Далее,  2  -  это  число связей файла (т.е. где-то в системе

есть  еще  одно  имя,  связанное  с  этим  файлом);  root  -  имя

владельца,  2048  -  число символов в файле, nov 3 12:11 - дата и

время  создания  или  последней  модификации  файла  (3  ноября в

12-11); bin - имя файла (каталог команд).

     Во второй   строке  указан  обычный  текстовый  файл (boot),

который прочие пользователи могут только читать.



     Команда   "pwd"   (без   флагов   и   аргументов)   сообщает

местоположение  пользователя  в  файловой  системе.  С ее помощью

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

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

заранее  вершине  дерева.  Пусть,  например,  это  будет  каталог

"/usr".

     Изменить  местонахождение можно командой "cd ". Так

можно перейти в каталог /usr/include/sys, набрав команду



	cd  /usr/include/sys



здесь указано полное имя , или



	cd  include/sys



здесь указано относительное имя.

     Отличительный  признак  относительного  имени  -  отсутствие

символа "/" в начале.

     Команда  "cd  .."  осуществит  переход  вверх  на предыдущий

уровень.    Из    "/usr/include/sys"    произойдет    переход   в

"/usr/include",  а  команда  "cd" (т.е. без параметров) осущствит

переход  в  начальный директорий пользователя (т.е. директорий, в

котором пользователь оказывается при входе в систему).



     Создать новые каталоги можно с помощью команды



     mkdir 



     Так  команда  "mkdir  err new" создаст в данном каталоге два

новых каталога с относительными именами "err" и "new".

     Удалить  пустой  (не  содержащий  файлов)  каталог  можно  с

помощью команды



     rmdir 



     Удалить обычный файл можно командой



     rm 



     Наиболее   естественный  для  пользователя  способ  создания

файлов   -   это  использование  текстового  редактора  "ed"  или

экранного  редактора  "red" (а также стандартных "vi" и "ех", или

многочисленных прочих "фирменных").

     В  ОС  Unix  около  200  базовых  команд  - инструментальных

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

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

специальных пакетов.



     Командой



     rm файл-1



можно удалить "файл-1".



    Командой



    rmdir файл-1



     можно  удалить  "файл-1", если это директорий, причем пустой

(т.е. не содержит файлов).



     Командой



     mv старое-имя новое-имя



можно переназвать файл.



     Командой



     cp старое-имя новое-имя



можно скопировать файл (сохранив также старый).



     Очень важна команда



     chmod 755 расчет



     которая   превращает   файл   "расчет",   подготовленный   в

редакторе,  в  командный,  иначе  "расчет"  при попытке вызова не

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

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

(rwx  -  чтение,  запись,  выполнение).  То  есть определяет, что

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

этого  расчета,  но  и  вносить в него изменения (7:111 - rwx). А

члены   группы   и  прочие  пользователи  могу  только  читать  и

выполнять, но не могут изменять этот расчет (55:101101 - r-xr-x).





		  3. ПРОСТЕЙШИЕ СРЕДСТВА SHELL



     Командный  язык  shell  (в  переводе  -  раковина, скорлупа)

фактически  есть  язык программирования очень высокого уровня. На

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

Обычно,  после  входа  в систему вы начинаете взаимодействовать с

командной оболочкой (если угодно - она начинает взаимодействовать

с  вами).  Признаком  того,  что оболочка (shell) готова к приему

команд  служит  выдаваемый  ею  на  экран  промптер. В простейшем

случае это один доллар ("$").

     Shell  не  является  необходимым  и  единственным  командным

языком  (хотя  именно  он  стандартизован  в  рамках POSIX [POSIX

1003.2]   -   стандарта   мобильных  систем).  Например,  немалой

популярностью  пользуется язык cshell, есть также kshell, bashell

(из  наиболее популярных в последнее время) и другие. Более того,

каждый  пользователь  может  создать  свой  командный язык. Может

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

разными командными языками.

     ОБРАТИТЕ  ВНИМАНИЕ.  shell - это одна из многих команд UNIX.

То  есть  в набор команд оболочки (интерпретатора) "shell" входит

команда  "sh"  -  вызов  интерпретатора  "shell".  Первый "shell"

вызывается  автоматически  при  вашем входе в систему и выдает на

экран промтер. После этого вы можете вызывать на выполнение любые

команды,  в  том  числе  и снова сам "shell", который вам создаст

новую оболочку внутри прежней.

     Так например, если вы подготовите в редакторе файл "f1":



     echo Hello!



     то  это  будет  обычный  текстовый  файл, содержащий команду

"echo", которая при выполнении выдает все написанное правее ее на

экран.  Можно  сделать  файл  "f1"  выполняемым с помощью команды

"chmod  755  f1". Но его можно ВЫПОЛНИТЬ, вызвав явно команду (!)

"sh" ("shell"):



     sh f1



или



     sh "  и  ">>"

обозначают перенаправление вывода.



	ls >f1



     команда  "ls"  сформирует  список файлов текущего каталога и

поместит его в файл "f1" (вместо выдачи на экран). Если файл "f1"

до этого существовал, то он будет затерт новым.



     pwd >>f1



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

поместит его в конец файла "f1", т.е. ">>" добавляет в файл, если

он непустой.

     Символы "<" и "<<" обозначают перенаправление ввода.



     wc -l f4   и   wc -l >f4  f2



     Данный  конвейер  из  файла "f1" ("cat") выберет все строки,

содержащие   слово   "result"   ("grep"),   отсортирует  ("sort")

полученные  строки,  а  затем  пронумерует  ("cat  -b") и выведет

результат в файл "f2".

     Поскольку  устройства  в  ОС  UNIX представлены специальными

файлами,  их можно использовать при перенаправлениях. Специальные

файлы  находятся  в  каталоге  "/dev".  Например,  "lp" - печать;

"console"  -  консоль; "ttyi" - i-ый терминал; "null" - фиктивный

(пустой) файл (устройство).

     Тогда,  например,



     ls > /dev/lp



     выведет  содержимое  текущего каталога на печать, а



     f1 f-err



     сообщения  об  ошибках  будут  направляться (об этом говорит

перенаправление  "2>")  в  файл  "f-err".  Кстати,  вы можете всю

информацию  направлять  в  один  файл  "ff", использовав в данном

случае конструкцию



     cat f1 f2 >>ff 2>ff



     Можно   указать   не  только  какой  из  стандартных  файлов

перенаправлять,   но  и  в  какой  стандартный  файл  осуществить

перенаправление.



     cat f1 f2 2>>ff 1>&2



     Здесь    сначала   "stderr"   перенаправляется   (в   режиме

добавления)    в   файл   "ff",   а   затем   стандартный   выход

перенаправляется  на  "stderr",  которым к этому моменту является

файл "ff". То есть результат будет аналогичен предыдущему.

     Конструкция "1>&2" - означает, что кроме номера стандартного

файла,  в который перенаправить,  необходимо впереди ставить "&";

вся конструкция пишется без пробелов.

     &-   - закрывает стандартный вывод.





	  3.4. Генерация имен файлов.



     При генерации имен используют метасимволы:

     *   -   произвольная  (возможно  пустая)  последовательность

символов;

     ? - один произвольный символ;

     [...] - любой из символов, указанных в скобках перечислением

и/или с указанием диапазона;



     cat f* - выдаст все файлы каталога, начинающиеся с "f";

     cat *f* - выдаст все файлы, содержащие "f";

     cat   program.?   -   выдаст   файлы   данного   каталога  с

однобуквенными расширениями, скажем "program.c" и "program.o", но

не выдаст "program.com";

     cat  [a-d]*  -  выдаст файлы, которые начинаются с "a", "b",

"c", "d". Аналогичный эффект дадут и команды "cat [abcd]*" и

"cat [bdac]*".





		  3.5. Командные файлы.



     Для  того,  чтобы текстовый файл можно было использовать как

команду, существует несколько возможностей.

     Пусть  с  помощью  редактора  создан  файл  с  именем "cmd",

содержащий одну строку следующего вида:



     date; pwd; ls



     Можно  вызвать  shell  как команду (!), обозначаемую "sh", и

передать  ей  файл "cmd",  как  аргумент или как перенаправленный

вход, т.е.



      $  sh cmd    или     $ sh . Введенное вами число

воспринимается   им   не  как  число,  а  как  последовательность

символов(!).  Интерпретор  не  проверяет, что вы ввели. Поэтому в

качестве  значения  переменной  может  оказаться  любая введенная

абракадабра  или  просто  нажатие  ,  как  значение пустой

строки.  (Для обеспечения проверки формата ввода следует написать

свою команду).



     При  обращении  к  shell-переменной  необходимо перед именем

ставить символ "$". Так команды



     echo $var_2

     echo var_2



выдадут на экран



     ОС UNIX

     var_2



     И еще один пример. Фрагмент командного файла:



     echo "var_2 = $var_2"



выдаст на экран



     var_2 = ОС UNIX



     В  команде  "echo" первое использование "var_2" - это просто

текст,   а  второе  ("$var_2")  -  это  значение  соответствующей

переменной.

     То  что здесь присутствуют пробелы между именем переменной и

символом  присваивания,  а  также  между  символом присваивания и

значением,  так  это  потому,  что  здесь  мы  имеем  дело лишь с

текстом,   куда   подставлены   значения   переменных.  Там,  где

действительно  выполняется  присваивание,  пробелы  в этих местах

НЕДОПУСТИМЫ.   Присваивание,  скажем,  w=  означает  присваивание

переменной   "w"   пустой   строки.  Но  и  пустую  строку  лучше

присваивать аккуратно, например w="".



     Для  того,  чтобы  имя  переменной  не сливалось со строкой,

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

     Пусть  a=/mnt/lab/asu/



тогда



     cat /mnt/lab/asu/prim



и



     cat ${a}prim



     равноценны  (т.е.  "cat" выдаст на экран содержимое одного и

того же файла).

     Если  также  предположить,  что  в  системе  есть переменная

"prim" и "prim=dir" , то команда



     echo ${a}$prim



выдаст на экран



     /mnt/lab/asu/dir





		  4.2. Экранирование



     Рассмотрим более подробно приемы экранирования, используемые

в  shell.  В  качестве средств экранирования используются двойные

кавычки (" "), одинарные кавычки (' ') и бэк-слэш (\).

     Из примеров очевидно их действие:

     Можно  в  одной  строке  записывать  несколько приcваиваний.



     x=22 y=33 z=$x

     A="$x" B='$x' C=\$x

     D="$x + $y + $z"  E='$x + $y + $z'  F=$x\ +\ $y\ +\ $z



     (присваивание G=$x + $y не было бы выполнено из-за пробелов)



     Тогда



     echo A = $A   B = $B   C = $C

     echo D = $D   E = $E   F = $F

     eval echo evaluated A = $A

     eval echo evaluated B = $B

     eval echo evaluated C = $C



     Выдадут на экран



     A = 22 B = $x C = $x

     D = 22 + 33 + 22 E = $x + $y + $z F = 22 + 33 + 22

     evaluated A = 22

     evaluated B = 22

     evaluated C = 22



     ВНИМАНИЕ. В трех последних случаях использована своеобразная

команда   "eval"   (от   evaluate   -   означивать),   которая  в

подставленной  в  нее  (в качестве  аргумента) команде  выполняет

означивание  переменных  (если  таковые  имеются).  В  результате

значение "A" остается прежним, поскольку "A" имеет значение "22".

А  переменные "B" и "C" имеют значение "$x". За счет означивания,

которое было выполнено командой "eval" - evaluated "B" и "C" дают

значения "22".

     Еще один пример на "eval".

     Пусть



     w=\$v v=\$u u=5



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



	       echo $w

	  eval echo $w

     eval eval echo $w



     на экран будет выведено



     $v

     $u

     5



     Приведем  еще  примеры,  связанные с экранированием перевода

строки.  Пусть  переменной  "string" присвоено значение "массива"

2x3:



abc

def



     Обатим  внимание,  что  для  избежания  присваивания  лишних

пробелов  вторая строка массива начата с первой позиции следующей

строки:



string="abc

def"



Тогда три варианта записи переменной в команде "echo"



echo  $string

echo '$string'

echo "$string"



дадут соответсвенно три различных результата:



abc def



$string



abc

def



а последовательность команд



echo "строка первая

строка вторая" > f1



echo 'строка первая

строка вторая' > f2



cat f1 f2



даст выдаст последовательно одинаковые файлы f1 и f2:



строка первая

строка вторая

строка первая

строка вторая



     Заметим   также,  что  бэк-слэш  (\)  не  только  экранирует

следующий  за  ним символ, что позволяет использовать специальные

символы  просто  как  символы, представляющие сами себя (он может

экранировать  и  сам  себя  -  \\), но в командном файле бэк-слэш

позволяет об'единять строки в одну (экранировать конец строки).

    Например, приводившийся ранее пример командной строки:



     cat f1 | grep -h result | sort | cat -b > f2



может быть записан в командном файле, скажем, как



     cat f1 | grep -h  \

     result | sort | cat -b > f2



     Кстати,  эффект  продолжения командной строки обеспечивает и

символ   конвейера.   В   данном  случае  это  может  дать  более

симпатичный результат, например:



     cat f1         |

     grep -h result |

     sort           |

     cat -b > f2





	       4.3. Манипуляции с shell-переменными



     Несмотря   на   то,  что  shell-переменные  в  общем  случае

воспринимаются  как  строки, т.е "35" - это не число, а строка из

двух   символов   "3"   и   "5",   в   раде   случаев  они  могут

интерпретироваться иначе, например, как целые числа.

     Разнообразные     возможности    имеет    команда    "expr".

     Проиллюстрируем некоторые на примерах:

     Выполнение командного файла:



     x=7 y=2

     a=`expr $x + $y`   ; echo a=$a

     a=`expr $a + 1`    ; echo a=$a

     b=`expr $y - $x`   ; echo b=$b

     c=`expr $x '*' $y` ; echo c=$c

     d=`expr $x / $y`   ; echo d=$d

     e=`expr $x % $y`   ; echo e=$e



выдаст на экран



     a=9

     a=10

     b=-5

     c=14

     d=3

     e=1



     ВНИМАНИЕ.  Операция  умножения ("*") обязательно должна быть

заэкранирована, поскольку в shell этот значек воспринимается, как

спецсимвол,  означающий,  что на это место может быть подставлена

любая последовательность символов.

     Следует  обратить  также  внимание  на обязательные пробелы,

отделяющие переменные и знаки операций.



     С   командой   "expr"  возможны  не  только  (целочисленные)

арифметические операции, но и строковые:



     A=`expr 'cocktail' : 'cock'`  ; echo $A

     B=`expr 'cocktail' : 'tail'`  ; echo $B

     C=`expr 'cocktail' : 'cook'`  ; echo $C

     D=`expr 'cock' : 'cocktail'`  ; echo $D



     На   экран   будут   выведены   числа,   показывающее  число

совпадающих  символов  в цепочках (от начала). Вторая из строк не

может быть длиннее первой :



     4

     0

     0

     0



     И наконец, об условной замене переменныйх.

     Если переменные, скажем "х", "y", "z", не определены, то при

обращении к переменным

     ${x-new} - в качестве значения "x" будет выдано "new",

     ${y=new} - в качестве значения "у" будет присвоено "new",

     ${z?new} - в качестве значения "z" будет выдано "z: new" и

соответствующая процедура прекращается.

     Во  всех  этих случаях, если переменная была к этому времени

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

     А  в  следующем  случае наоборот, пусть переменная "v" имеет

какое-то значение, тогда

     ${z+new}  -  в  качестве  значения "z" будет выдано "new", а

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





		    4.4. Экспорт переменных



     В  ОС  UNIX  существует  понятие процесса. Процесс возникает

тогда,   когда   запускается  на  выполнение  какая-либо  команда

(расчет).

     Например,  при  наборе на клавиатуре "р " порождается

процесс  расчета  "р".  В  свою очередь "р" может породить другие

процессы. Допустим, что "р" вызывает расчеты "р1" и "р2", которые

последовательно порождают соответсвующие процессы.

     У каждого процесса есть своя среда - множество доступных ему

переменных.  Например,  до  запуска  расчета "р" уже существовала

среда,  в  которой  уже  были  определены некоторые переменные (о

стандартных  переменных  речь пойдет несколько позже). Запуск "р"

порождает  новую  среду; уже в ней будут порождены расчеты "р1" и

"р2".

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

объявлены,  т.е.  где  им присвоены значения (описание переменных

отсутсвует  -  они  все  одного  типа).  Для того, чтобы они были

доступны  и  другим порождаемым процессам, надо передать их явным

образом. Для этого используется встроенная команда "export".



     Пример.

     Пусть расчет (командный файл) "p", имеющий вид:



     # расчет p

     echo Расчет p

     varX=0 varY=1

     echo varX=$varX varY=$varY

     export varY

     p1  # вызов расчета p1

     p2  # вызов расчета p2

     echo Снова расчет p: varX=$varX varY=$varY



     вызывает командные файлы "p1" и "p2", имеющие вид:



     # расчет p1

     echo Расчет p1

     echo varX=$varX varY=$varY

     varX=a varY=b

     echo varX=$varX varY=$varY

     export varX



     # расчет p2

     echo Расчет p2

     echo varX=$varX varY=$varY

     varX=A varY=B

     echo varX=$varX varY=$varY

     export varY



     На экран будут выданы следующая информация:



     Расчет p

     varX=0 varY=1

     Расчет p1

     varX= varY=1

     varX=a varY=b

     Расчет p2

     varX= varY=1

     varX=A varY=B

     Снова расчет p: varX=0 varY=1



     Из  примера  видно,  что  значения переменных экспортируются

только  в  вызываемые расчеты (и не передаются "вверх" и "вбок").

Экспортировать переменные можно и командой "set" с флагом "-a".

     НА   ВСЯКИЙ   СЛУЧАЙ   заметим,  что  на  передачу  значений

переменных    никакого    влияния   не   оказывает   "физическое"

взаимное расположение (файлов) расчетов в файловой системе.





		4.5. Параметры



     В  командный  файл  могут  быть  переданы параметры. В shell

используются  позиционные параметры (т.е. существенна очередность

их  следования).  В  командном  файле  соответствующие параметрам

переменные  (аналогично  shell-переменным)  начинаются  с символа

"$", а далее следует одна из цифр от 0 до 9:



     Пусть  расчет  "examp-1"  вызывается  с параметрами "cock" и

"tail".  Эти  параметры  попадают  в новую среду под стандартными

именами  "1" и "2". В (стандартной) переменной с именем "0" будет

храниться имя вызванного расчета.

     При  обращении  к  параметрам  перед  цифрой ставится символ

доллара "$" (как и при обращении к переменным):

     $0 - соответствует имени данного командного файла;

     $1 - первый по порядку параметр;

     $2 - второй параметр и т.д.



     Пусть командный файл с именем "examp-1" имеет вид



      echo Это расчет $0:

      sort $2 >> $1

      cat $1



     а файлы "cock" и "tail" содержат соответсвенно



cock:

      Это отсортированный файл:



tail:

      1

      3

      2



     Тогда после вызова команды



      examp-1 cock tail



на экране будет



     Это расчет examp-1:

     Это отсортированный файл:

     1

     2

     3



     Поскольку  число  переменных,  в  которые могут передаваться

параметры,  ограничено  одной  цифрой,  т.е.  9-ю  ("0",  как уже

отмечалось  имеет  особый  смысл), то для передачи большего числа

параметров используется специальная команда "shift".

     Рассмотрим ее действие на примере.



     Пусть командный файл "many" вызывается с 13-ю параметрами



     many 10 20 30 40 50 60 70 80 90 100 110 120 130



     И имеет вид





     ###

     # many: Передача большого числа параметров.

     echo "$0: Много параметров"

     echo " Общее число параметров = $#

     Исходное состояние: $1 $5 $9 "

     shift

     echo "1 сдвиг: первый=$1 пятый=$5 девятый=$9"

     shift 2

     echo "1 + 2 = 3 сдвига: первый=$1 пятый=$5 девятый=$9"

     perem=`expr $1 + $2 + $3`

     echo $perem



     В  результате  первого  применения  команды  "shift"  второй

параметр  расчета  вызывается  как $1, третий параметр вызывается

как  $2,  ...  десятый  параметр, который был исходно недоступен,

вызывается как $9. Но стал недоступным первый параметр!

     После выполнения этого расчета на экране будет:



     many: Много параметров

     Общее число параметров = 13

     Исходное состояние: 10 50 90

     1 сдвиг: первый=20 пятый=60 девятый=100

     1 + 2 = 3 сдвиг: первый=40 пятый=80 девятый=120

     150



     Своеобразный подход к параметрам дает команда "set".

     Например, фрагмент расчета



     set a b с

     echo первый=$1 второй=$2 третий=$3



     выдаст на экран



     первый=a второй=b третий=c



     т.е.  команда  "set"  устанавливает значения параметров. Это

бывает  очень  удобно.  Например,  команда "date" выдает на экран

текущую  дату,  скажем, "Mon May 01 12:15:10 2000",  сосотящую из

пяти слов, тогда



      set `date`

      echo $1 $3 $5



      выдаст на экран



      Mon 01 2000



     Команда   "set"   позволяет   также   осуществлять  контроль

выполнения программы, например:

     set -v - на терминал выводятся строки, читаемые shell.

     set +v - отменяет предыдущий режим.

     set -x - на терминал выводятся команды перед выполнением.

     set +x - отменяет предыдущий режим.

     Команда  "set"  без параметров выводит на терминал состояние

программной среды (см далее).



	       4.6. Подстановки shell-интерпретатора



     Перед  началом  непосредственной интерпретации и выполнением

команд,   содержащихся   в   командных  файлах,  shell  выполняет

различные виды подстановок:

     1.   ПОДСТАНОВКА   РЕЗУЛЬТАТОВ.   Выполняются  все  команды,

заключенные  в  обратные  кавычки,  и  на  их место подставляется

результат.

     2.  ПОДСТАНОВКА  ЗНАЧЕНИЙ  ПАРАМЕТРОВ  И ПЕРЕМЕННЫХ. То есть

слова, начинающиеся на "$", заменяются соответсвующими значениями

переменных и параметров.

     3.    ИНТЕРПРЕТАЦИЯ   ПРОБЕЛОВ.   Заэкранированные   пробелы

игнорируются.

     4. ГЕНЕРАЦИЯ ИМЕН ФАЙЛОВ. Проверяются слова на наличие в них

спецсимволов   ("*", "?","[]")   и  выполняются    соответсвующие

генерации.





		  4.7. Программная среда



     Каждый  процесс имеет среду, в которой он выполняется. shell

использует ряд переменных этой среды.

     Если  вы  наберете команду "set" без параметров, то на экран

будет  выдана информация о ряде стандартных переменных, созданных

при  входе  в  систему  (и  передаваемых  далее  всем вашим новым

процессам  "по  наследству"),  а  также  переменных,  созданных и

экспортируемых вашими процессами.

     Конкретный  вид и содержание выдаваемой информации в немалой

степени зависит от того, какая версия UNIX используется и как

инсталлирована система.

     Вот лишь часть того, что выдала мне команда "set":



     HOME=/home/sae

     PATH=/usr/local/bin:/usr/bin:/bin:.:/usr/bin/X11:

     IFS=



     LOGNAME=sae

     MAIL=/var/spool/mail/sae

     PWD=/home/sae/STUDY/SHELL

     PS1=${PWD}:" "

     PS2=>

     SHELL=/bin/bash

     TERM=linux

     TERMCAP=console|con80x25|dumb|linux:li#25:co#80::

     UID=501

     perem=stroka

     x=5



     Прокомментируем эти присваивания значений переменным.



     HOME=/home/sae  -  это  имя  домашнего директория, в котором

пользователь  (в  данном  случае  я)  оказывается  после  входа в

систему.  То  есть,  правильно  набрав  имя и пароль, я окажусь в

директории "/home/sae".



     PATH=/bin:/usr/bin:.:/usr/local/bin:/usr/bin/X11    -    эта

переменная  задает  последоватьельность  файлов  (ТРОПУ), которые

просматривает "shell" в поисках команды. Имена файлов разделяются

здесь  двоеточиями.  Последовательность  просмотра  соответствует

очередности  следования  имен  в  тропе.  НО  ПЕРВОНАЧАЛЬНО поиск

происходит  среди  так  называемых  встроенных  команд.  В  число

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

например   "echo",  "cd",  "pwd",  "date".  После  этого  система

просматривает   директорий  "/bin",  в  котром  могут  находиться

команды "sh", "cp", "mv", "ls" и т.п. Затем директорий "/usr/bin"

с  командами  "cat",  "сс",  "expr",  "nroff",  "man"  и  многими

другими.  Далее  поиск  происходит в текущем директории (".", или

другое обозначение - "пусто", т.е.""), где скорее всего находятся

написанные вами команды (расчеты).

     После  набора  командной  строки  и  нажатия  "shell"

(после   выполнения   необходимых  подстановок)  распознает  имя,

соответстующее  команде  и  осуществляеет ее поиск в директориях,

перечисленных   в   тропе.   Если   команда  размещена  вне  этих

директориев  -  она не будет найдена. Если присутствует несколько

команд   с  одинаковым  именем,  то  вызвана  будет  та,  которая

расположена в директории, просматриваемом первым.

     Тропу, как и прочие перемнные, можно легко менять, добавляя,

переставляя  или  исключая  директории.  (Кстати,  представленная

тропа получена из "настоящей" путем сокращений и перестановок).



     IFS=   - (Внутренний Разделитель Полей) перечисляет символы,

которые  служат  для  разделения  слов (полей). Таковыми являются

"пробел",  "табуляция" и "перевод строки", поэтому здесь слева от

присваивания ничего не видно и занято две строки.



     LOGNAME=sae  - имя входа ("имя" пользователя).



     MAIL=/var/spool/mail/sae  -  имя  файла, в который поступает

(электронная) почта.



     PWD=/home/sae/STUDY/SHELL  - имя текущего директория



     PS1=${PWD}:" "   - вид промтера. В данном случае в промптере

будет  выдаваться  имя текущего директория двоеточие и пробел. То

есть здесь будет "/home/sae/STUDY/SHELL: ".



     PS2=>   -   этот   промтер   (эдесь  ">")  используется  как

приглашение    к   продолжению   ввода   (в   очередной   строке)

незаконченной  команды. Например, наберите открывающую скобку "("

и  после  нажатия    в  следующей  строке  вы увидите этот

промптер.  Если  пока  не  знаете,  что  дальше  делать, наберите

закрывающую скобку ")" - и он исчезнет.



     SHELL=/bin/bash - эта переменная указывает оболочку, которую

использует   пользователь.   В   данном  случае  используется  не

(стандартный)  shell  ("sh"),  а  "продвинутая"  версия - "bash",

написанная тем же автором (Bourne-Again SHell).



     TERM=linux - указание типа терминала.



     TERMCAP=console|con80x25|dumb|linux:li#25:co#80::          -

(TERMinal  CAPacity) это (очень сильно) обрезанная строка задания

параметров терминала.



     UID=501       -  идентификатор пользователя (мой - "501").



     perem=stroka

     x=5          - переменные, которые ввел пользователь.



     Исходная  среда  устанавливается  автоматически  при входе в

систему с использованием файлов типа "/etc/rc" и "/etc/.profile".

     ВАЖНОЕ  ЗАМЕЧАНИЕ.  Один  из  способов  просто изменит среду

(например,  тропу поиска команд, вид промтера, вид оболочки, цвет

экрана  и  т.п.) можно, разместив эту информацию в своем домашнем

директории     в     специальизированном     файле     ".profile"

(${HOME}/.profile), присвоив нужные значения переменным среды. То

есть  вызвать  это  файл  в  редактор и написать, что пожелаете).

Тогда   при   каждом  вашем  входе  в  систему  этот  файл  будет

автоматически  выполняться и устанавливать новую среду. Этот файл

должен   ОБЯЗАТЕЛЬНО  размещаться  в  вашем  ДОМАШНЕМ  директории

(директории входа).

     Если  вы внесли изменения в ".profile", то для переноса этих

изменений в среду необходимо выполнить этот файл. Для этого можно

выйти   и   заново  войти  в  систему,  а  можно  воспользоваться

(специально  для  этого случая созданной) командой "." без выхода

из системы, т.е.



     . .profile



     Следует  иметь  в  виду,  что  имена  файлов, начинающиеся с

точки,  вообще имеют особый статус. Так, они не выдаются на экран

простой  командой "ls" - необходимо вызывать эту команду с флагом

"-a". Кстати, и не уничтожаются огульно командой "rm *".



     Дописать  новый  совй  директорий "my" в тропу команд можно,

записав в ".profile", например



     PATH=${PATH}:/home/sae/my



или



     PATH=${PATH}:${HOME}/my



     Как   правило,   устанавливаемые  переменные  среды  следует

экспортировать. Например,



     export TERM PATH REDKEYS MAIL



     Кроме  определения  переменных  в ".profile" можно выполнить

команды, например команда

      stty -lcase

установит терминал в режим "большие и маленькие буквы"; а команда

      cat заставка

     выдаст  на  экран  заставку  , которую вы сами подготовите в

файле  "заставка"  с  учетом  ваших  эстетических  пристрастий  и

художественных способностей.





     Сам  интерпретатор  shell автоматически присваивает значения

следующим переменным (параметрам):

     ?  - значение, возвращенное последней командой;

     $  - номер процесса;

     !  - номер фонового процесса;

     #  - число позиционных параметров, передаваемых в shell;

     *  - перечень параметров, как одна строка;

     @  - перечень параметров, как совокупность слов;

     -  - флаги, передаваемые в shell.

     При  обращении к этим переменным (т.е при использовании их в

командном файле - shell-программе) следует впереди ставить "$".

     Пример. Вызов расчета



     specific par1 par2 par3



     имеющего вид



     ###

     # specific: Специальные параметры (переменные)



     echo $0 - имя расчета

     echo $? - код завершения

     echo $$ - идентификатор последнего процесса

     echo $! - идентификатор последнего фонового процесса

     echo

     echo $* - значения параметров, как строки

     echo $@ - значения параметров, как слов

     echo

     set -au

     echo $- - режимы работы интерпретатора



     Выдаст на экран



     specific - имя расчета

     0 - код завершения

     499 - идентификатор последнего процесса

     98 - идентификатор последнего фонового процесса



     par1 par2 par3 - значения параметров, как строки

     par1 par2 par3 - значения параметров, как слов



     au - режимы работы интерпретатора





     Код  "0" соответсвует нормальному завершению процесса.

     Важную   роль   при   создании   уникальных   файлов  играет

специальная   переменная  "$$",  значение  которой  соответствует

номеру процесса, выполняющего данный расчет. Каждый новый расчет,

выполняемый компьютером, инициирует один или несколько процессов,

автоматически  получающих  номера  по-порядку. Поэтому, используя

номер  процесса в качестве имени файла, можно быть уверенным, что

каждый  новый  файл  будет иметь новое имя (не запишется на место

уже  существующего).  Достоинство  является и главным недостатком

такого  способа  именования файлов. Неизвестно, какие имена будут

присвоены  файлам.  И, если в рамках данного процесса можно найти

файл "не глядя", т.е., обратившись к нему, используя $$, то потом

такие  файлы  можно  легко  потерять.  Это создает дополнительные

проблемы при отладке программ.

     "echo" без параметров выводит пустую строку.

     Различия  $*  и $@ состоит в том, что певая переменная может

быть  представлена  как



     "par1  par2  par3"



а вторая как



     "par1" "par2" "par3"



     Пример, иллюстрирующий различия "$*" и "$@" будет рассмотрен

в связи с оператором "for".

     Для   иллюстрации   мы   установили  командой  "set"  режимы

интерпретатора  ("a" - все последующие переменные экспортируются;

"u"  -  отсутствие параметра считать ошибкой), что и отразилось в

специальной переменной "$-".





		  5. ПРОГРАММНЫЕ  СТРУКТУРЫ



     Как во всяком языке программирования в тексте на языке shell

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

что  находится  в строке (в командном файле) левее этого символа,

воспринимается интерпретатором как комментарий. Например,



     # Это комментарий.

     ## И это.

     ### И это тоже.



     Как  во  всяком  процедурном  языке программирования в языке

shell   есть   операторы.   Ряд  операторов  позволяет  управлять

последовательностью  выполнения  команд. В таких операторах часто

необходима  проверка  условия,  которая  и определяет направление

продолжения вычислений.





		 5.1. Команда test ("[ ]")



     Команда  test  проверяет  выполнение  некоторого  условия. С

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

выбора и цикла языка shell.



     Два возможных формата команды:



     test условие

или

     [ условие ]



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

чтобы писать перед условием слово "test", будем заключать условие

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

     На  самом  деле  shell  будет  распознавать  эту  команду по

открывающей  скобке  "[",  как  слову(!), соответсвующему команде

"test".    Уже    этого    достаточно,   чтобы   предупредить   о

распространенной ошибке начинающих: Между скобками и содержащимся

в них условием обязательно должны быть пробелы.

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

или  операции  (как,  кстати,  и  в  команде "expr"). Не путать с

противоположным требованием для присваивания значений переменным.

     В shell используются условия различных "типов".



     УСЛОВИЯ ПРОВЕРКИ ФАЙЛОВ:

     -f file - файл "file" является обычным файлом;

     -d file - файл "file" - каталог;

     -с file - файл "file" - специальный файл;

     -r file - имеется разрешение на чтение файла "file";

     -w file - имеется разрешение на запись в файл "file";

     -s file - файл "file" не пустой.



     Примеры. Вводя с клавиатуры командные строки в первом случае

получим  подтверждение  (код  завершения  "0"),  а  во  втором  -

опровержение (код завершения "1"). "specific" - имя существующего

файла.



     [ -f specific ] ; echo $?

     0



     [ -d specific ] ; echo $?

     1



     УСЛОВИЯ ПРОВЕРКИ СТРОК:

     str1 = str2  - строки "str1" и "str2" совпадают;

     str1 != str2  - строки "str1" и "str2" не совпадают;

     -n str1  - строка "str1" существует (непустая);

     -z str1  строка "str1" не существует (пустая).



     Примеры.



     x="who is who"; export x; [ "who is who" = "$x" ]; echo $?

     0



     x=abc ; export x ; [ abc = "$x" ] ; echo $?

     0



     x=abc ; export x ; [ -n "$x" ] ; echo $?

     0



     x="" ; export x ; [ -n "$x" ] ; echo $?

     1



     ВАЖНОЕ  ЗАМЕЧАНИЕ.  Команда  "test"  дает  значение "истина"

(т.е.  код завершения "0") и просто если в скобках стоит непустое

слово.



      [ privet ] ; echo $?

      0



      [ ] ; echo $?

      1



     Кроме  того,  существуют  два  стандартных значения условия,

которые  могут  использоваться вместо условия (для этого не нужны

скобки).



      true ; echo $?

      0



      false ; echo $?

      1



     УСЛОВИЯ СРАВНЕНИЯ ЦЕЛЫХ ЧИСЕЛ:

     x -eq y   - "x" равно "y",

     x -ne y   - "x" неравно "y",

     x -gt y   - "x" больше "y",

     x -ge y   - "x" больше или равно "y",

     x -lt y   - "x" меньше "y",

     x -le y   - "x" меньше или равно "y".



     То  есть  в данном случае команда "test" воспринимает строки

символов  как  целые (!) числа. Поэтому во всех остальных случаях

"нулевому"  значению  соответствует  пустая  строка.  В данном же

случае,  если  надо  обнулить  переменную,  скажем,  "x",  то это

достигается присваиванием "x=0".

     Примеры.



     x=abc ; export x ; [ abc -eq "$x" ] ; echo $?

     "[": integer expression expected before -eq



     x=321 ; export x ; [ 321 -eq "$x" ] ; echo $?

     0



     x=3.21 ; export x ; [ 3.21 -eq "$x" ] ; echo $?

     "[": integer expression expected before -eq



     x=321 ; export x ; [ 123 -lt "$x" ] ; echo $?

     0



     СЛОЖНЫЕ УСЛОВИЯ:

     Реализуются с помощью типовых логических операций:

     !   -  (not)  инвертирует значение кода завершения.

     -o  -  (or) соответсвует логическому "ИЛИ".

     -a  -  (and) соответсвует логическому "И".

     ПРЕДУПРЕЖДЕНИЕ. Не забывайте о пробелах.



     Примеры.



      [ ! privet ] ; echo $?

      1



     x=privet; export x; [ "$x" -a -f specific ] ; echo $?

     0



     x="";export x; [ "$x" -a -f specific ] ; echo $?

     1



     x="";export x; [ "$x" -a -f specific -o privet ] ; echo $?

     0



     x="";export x; [ "$x" -a -f specific -o ! privet ] ; echo $?

     1



     СОВЕТ. Не злоупотреблять сложными условиями.





		5.2. Условный оператор "if"



    В общем случае оператор "if" имеет структуру



    if  условие

      then  список

	 [elif  условие

	  then  список]

      [else  список]

    fi



     Здесь  "elif"  сокращенный  вариант  от "else if" может быть

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

произвольного  числа  операторов  "if" (как и других опреаторов).

Разумеется  "список"  в  каждом  случае должен быть осмысленный и

допустимый в данном контексте.

     Конструкции



     [elif  условие

      then  список]

и

     [else  список]



     не  являются  обязательными (в данном случае для указания на

необязательность  конструкций использованы квадратные скобки - не

путать с квадратными скобками команды "test"!).

     Самая усеченная структура этого оператора



    if   условие

      then  список

    fi



     если  выполнено  условие  (как  правило  это ком получен код

завершения "0", то выполняется "список", иначе он пропускается.

     Обратите  внимание,  что  структура  обязательно завершается

служебным  словом  "fi".  Число  "fi", естественно, всегда должно

соответсвовать числу "if".



     Примеры.

     Пусть написан расчет "if-1"



     if [ $1 -gt $2 ]

	then pwd

	else echo $0 : Hello!

     fi



     Тогда вызов расчета



     if-1 12 11



даст



     /home/sae/STUDY/SHELL



а

     if-1 12 13



даст



     if-1 : Hello!



     Возможно  использовать  в  условии  то  свойство  shell, что

команды  могут  выдавать различный код завершения. Это напоминает

приемы программирования на Си. Пусть расчет "if-2" будет



     if a=`expr "$1" : "$2"`

	then echo then a=$a code=$?

	else echo else a=$a code=$?

     fi



тогда вызов



     if-2  by by



даст



     then a=2 code=0



а



     if-2  by be



даст



     else a=0 code=1





     Еще пример на вложенность



     ###

     # if-3: Оценка достижений



     echo -n " А какую оценку получил на экзамене?: "

     read z

     if [ $z = 5 ]

	then echo  Молодец !

	elif [ $z = 4 ]

	     then echo  Все равно молодец !

	     elif [ $z = 3 ]

		  then echo  Все равно !

		  elif [ $z = 2 ]

		       then echo  Все !

		       else echo   !

     fi



     Можно  обратить  внимание на то, что желательно использовать

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

структур.





	       5.3. Оператор выбова ("case")



     Оператор выбора "case" имеет структуру:



     case   строка  in

	шаблон)  список команд;;

	шаблон)  список команд;;

	    ...

     esac



     Здесь  "case" "in" и "esac" - служебные слова. "Строка" (это

может  быть  и  один  символ)  сравнивается  с  "шаблоном". Затем

выполняется  "список  команд" выбранной строки. Непривычным будет

служебное   слово   "esac",  но  оно  необходимо  для  завершения

структуры.

     Пример.



     ###

     # case-1: Структура "case".

     #         Уже рассматривавшийся в связи со

     #         структурой "if" пример проще и

     #         нагляднее можно реализовать с

     #         помощью структуры "case".



     echo -n " А какую оценку получил на экзамене?: "

     read z

     case $z in

	5) echo Молодец !            ;;

	4) echo Все равно молодец !  ;;

	3) echo Все равно !          ;;

	2) echo Все !                ;;

	*) echo  !                   ;;

     esac



     Непривычно  выглядят  в конце строк выбора ";;", но написать

здесь  ";"  было  бы  ошибкой. Для каждой альтернативы может быть

выполнено  несколько  команд.  Если  эти команды будут записаны в

одну  строку,  то символ ";" будет использоваться как разделитель

команд.

     Обычно  последняя  строка  выбора  имеет  шаблон  "*", что в

структуре   "case"   означает   "любое   значение".   Эта  строка

выбирается,  если  не  произошло  совпадение  значения переменной

(здесь  $z) ни с одним из ранее записанных шаблонов, ограниченных

скобкой ")". Значения просматриваются в порядке записи.



     ###

     # case-2:  Справочник.

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

     #          название холдинга, в который она входит



     case $1 in

	     ONE|TWO|THREE) echo Холдинг: ZERO    ;;

		   MMM|WWW) echo Холдинг: Not-Net ;;

	 Hi|Hello|Howdoing) echo Холдинг: Привет! ;;

			 *) echo Нет такой фирмы  ;;

     esac



     При вызове "case-2 Hello" на экран будет выведено:



     Холдинг: Привет!



     А при вызове "case-2 HELLO" на экран будет выведено:



     Нет такой фирмы



     Коль  скоро слово "case" переводится как "выбор", то это как

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

реализации простейших меню.



     ###

     # case-3: Реализация меню с помощью команды "case"



     echo "Назовите файл, а затем (через пробел)

     наберите цифру, соответствующую требуемой

     обработке:

	    1 - отсортировать

	    2 - выдать на экран

	    3 - определить число строк  "

     read x y  # x - имя файла, y - что сделать

     case $y in

	1) sort   > $1                           ;;

	  2) cat >> $2  ${1}_sorted



     т.е. последовательно сортируются указанные файлы, результаты

сортировки выводятся на печать ("/dev/lp") и направляются в файлы



   f1_sorted  f2_sorted  и  f3_sorted



     Можно  сделать  более универсальной команду "lsort", если не

фиксировать  перечень файлов в команде, а передавать произвольное

их число параметрами.

     Тогда головная программа будет следующей:



   for i

       do

	 proc-sort $i

       done



     Здесь   отсутствие   после   "i"  служебного  слова  "in"  с

перечислением  имен  говорит  о  том , что список поступает через

параметры  команды. Результат предыдущего примера можно получить,

набрав



   lsort f1 f2 f3



     Усложним   ранее   рассматривавшуюся   задачу   (под  именем

"case-2")  определения  холдинга  фирмы.  Теперь можно при вызове

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

структуре   оператора   "for"  фрагмента  "in  список  значений",

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



     ###

     # holding: Справочник.

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

     #          название холдинга, в который она входит

     for i

	 do

	     case $i in

			 ONE|TWO|THREE) echo Холдинг: ZERO    ;;

			       MMM|WWW) echo Холдинг: Not-Net ;;

		     Hi|Hello|Howdoing) echo Холдинг: Привет! ;;

				     *) echo Нет такой фирмы  ;;

	     esac

	 done





     При вызове "holding Hello HELLO ONE" на экране будет:



     Холдинг: Привет!

     Нет такой фирмы

     Холдинг: Not-Net



     Еще пример.



     ###

     # subdir: Выдает имена всех поддиректориев

     #         директория с именем $dir



	     for i in $dir/*

	     do

		if [ -d  $i ]

		   then echo $i

		fi

	     done



     Следующий  расчет  иллюстрирует  полезный,  хотя  и  с долей

трюкачества,  способ повторения одних и тех же действий несколько

раз. Переменныя "i" принимает здесь пять значений: 1, 2, 3, 4, 5,

но  внутри цикла эта переменная отсутствует и поэтому ее значение

никакой  роли  не  играет и ни чего не меняет. С таким же успехом

переменная  "i"  могла принимать значения, скажем ф о к у с , а в

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

вычисление содержимого цикла без изменений.



     ###

     # print-5: Организации пятикратного выполнения команды



     for i in 1 2 3 4 5

	do

	   cat file-22 > /dev/lp

	done



     Расчет  "print-n" иллюстрирует еще одну полезную возможность

в   использовании   цикла   "for".  Здесь,  после  "for  i  ...",

отсутствуют  "in ..." и перечень имен, т.е. перечнем имен для "i"

становится   перечень   параметров,  а  следовательно  количество

печатаемых экземпляров можно менять.



     ###

     # print-n: Задание числа копий

     #          через параметры



     for i

	  do

		  cat file-22 > /dev/lp

	  done



     Смысл не изменится, если первую строку расчета записать как



	for i in $*



     поскольку значение "$*" - есть список значений параметров.



     Отметим  различие  в  специальных  переменных  "$*"  и "$@",

представляющих    перечень    параметров.   Первый   представляет

параметры, как строку, а второй, как совокупность слов.

     Пусть командный файл "cmp" имеет вид:



     for i in "$*"

       do

	   echo $i

       done

     echo

     for i in "$@"

	do

	   echo $i

	done



При вызове



     cmp aa bb cc



на экран будет выведено



     aa bb cc



     aa

     bb

     cc





	5.4. Оператор цикла с истинным условием ("while")



     Структура "while", также обеспечивающая выполнение расчетов,

предпочтительнее  тогда,  когда  неизвестен заранее точный список

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

результате вычислений в цикле.



    Оператор цикла "while" имеет структуру:



    while условие

	do

	    список команд

	done



     где  "while"  -  служебное  слово  определяющее  тип цикла с

истинным  условием.  Список  команд  в  теле  цикла (между "do" и

"done")  повторяется  до  тех  пор,  пока  сохраняется истинность

условия (т.е. код завершения последней команды в теле цикла равен

"0")  или  цикл  не  будет прерван изнутри специальными командами

("break", "continue" или "exit"). При первом входе в цикл условие

должно выполняться.



     ###

     # print-50: Структура "while"

     #           Расчет позволяет напечатать 50

     #           экземпляров файла "file-22"

     n=0

     while [ $n -lt 50 ]    # пока n  /dev/lp

     done



     Обратим   внимание   на   то,  что  переменной  "n"  вначале

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

"expr"  работает  с  shell-переменными как с целыми числами, а не

как со строками.



     n=`expr $n + 1`



     т.е. при каждом выполнении значение "n" увеличивается на 1.



     Как  и  вообще  в  жизни,  можно  реализовать  то же самое и

сложнее.  Расчет  "рr-br"  приведен  для иллюстрации бесконечного

цикла  и  использования  команды  "break",  которая  обеспечивает

прекращение цикла.



     ###

     # рr-br: Структура "while" c "break"

     #        Расчет позволяет напечатать 50

     #        экземпляров файла "file-22"

     n=0

     while true

     do

	if [ $n -lt 50 ]           # если n  /dev/lp

     done



     Команда  "break  [n]"  позволяет выходить из цикла. Если "n"

отсутствует,  то  это эквивалентно "break 1". "n" указывает число

вложенных  циклов,  из  которых надо выйти, например, "break 3" -

выход из трех вложенных циклов.

     В  отличие  от  команды  "break" команда "continue [n]" лишь

прекращает  выполнение  текущего  цикла  и  возвращает  на НАЧАЛО

цикла.  Она также может быть с параметром. Например, "continue 2"

означает  выход  на  начало  второго  (если  считать  из глубины)

вложенного цикла.

     Команда  "exit  [n]"  позволяет  выйти вообще из процедуры с

кодом  возврата  "0"  или  "n"  (если  параметр  "n" указан). Эта

команда  может использоваться не только в циклах. Даже в линейной

последовательности  команд  она  может  быть полезна при отладке,

чтобы прекратит выполнение (текущего) расчета в заданной точке.





	   5.5. Оператор цикла с ложным условием ("until")



    Оператор цикла "until" имеет структуру:



    until условие

	do

	    список команд

	done



     где  "until"  -  служебное  слово  определяющее  тип цикла с

ложным условием. Список команд в теле цикла (между "do" и "done")

повторяется  до  тех  пор,  пока сохраняется ложность условия или

цикл  не  будет  прерван изнутри специальными командами ("break",

"continue" или "exit"). При первом входе в цикл условие не должно

выполняться.

     Отличие  от  оператора  "while"  состоит  в том, что условие

цикла  проверяется  на  ложность  (на  ненулевой  код  завершения

последней  команды  тела  цикла) проверяется ПОСЛЕ каждого (в том

числе и первого!) выполнения команд тела цикла.

     Программистов,  знакомых  с  операторами  "until"  в  других

языках может вначале сбивать такая семантика этого оператора.

     Примеры.



     until false

     do

	 read x

	 if   [ $x = 5 ]

	   then echo enough ; break

	   else echo some more

	 fi

     done



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

(повторяя  на  экране  фразу  "some more"), пока не будет введено

"5".  После  этого выдается "enough" и команда "break" перкращает

выполнение цикла.

     Другой  пример  ("Ожидание полдня") иллюстрирует возможность

использовать в условии вычисления.



     until date | grep 12:00:

     do

	 sleep 30

     done



     Здесь каждые 30 секунд выполняется командная строка условия.

Команда  "date"  выдает  текущую  дату  и  время.  Команда "grep"

получает  эту  информацию  через  конвейер  и пытается совместить

заданный  шаблон "12:00:" с временем, выдаваемым командой "date".

При несовпадении "grep" выдает код возврата "1", что соответсвует

значению "ложь", и цикл "выполняет ожидание" в течение 30 секунд,

после  чего повторяется выполнение условия. В полдень (возможно с

несколькими   секундами)  произойдет  сравнение,  условие  станет

истинным,  "grep"  выдаст на экран соответсвующую строку и работа

цикла закончится.





		  5.6. Пустой оператор



     Пустой оператор имеет формат



     :



     Ничего не делает. Возвращает значение "0".

Например, в конструкции "while :" или ставить в начале командного

файла,   чтобы   гарантировать,  что  файл  не  будет  принят  за

выполняемый файл для "csh".





		  5.7. Функции в shell



     Функция   позволяет  подготовить  список  команд  shell  для

последующего выполнения.



     Описание функции меет вид:



     имя()

     {

     список команд

     }



     после  чего  обращение  к  функции  происходит по имени. При

выполнении  функции не создается нового процесса. Она выполняется

в среде соответсвующего процесса. Аргументы функции становятся ее

позиционными  параметрами;  имя  функции  -  ее нулевой параметр.

Прервать  выполнение  функции  можно оператором "return [n]", где

(необязательное) "n" - код возврата.

     Пример.   Вызов   на  выполнение  файла  "fun"



     echo $$



     fn()                 # описание функции

     {

     echo xx=$xx

     echo $#

     echo $0: $$ $1 $2

     xx=yy ; echo xx=$xx

     return 5

     }



     xx=xx ; echo xx=$xx

     fn a b               # вызов функции "fn" с параметрами

     echo $?

     echo xx=$xx



содержащего описание и вызов функции "fn", выдаст на экран:



     749

     xx=xx

     xx=xx

     2

     fun: 749 a b

     xx=yy

     5

     xx=yy





		5.8. Обработка прерываний ("trap")



     Бывает   необходимо   защитить   выполнение   программы   от

прерывания.

     Наиболее   часто   приходится   встречаться   со  следующими

прерываниями, соответсвующими сигналам:

     0  - выход из интерпретатора,

     1  - отбой (отключение удаленного абонента),

     2  - прерывание от ,

     9  - уничтожение (не перехватывается),

     15 - окончание выполнения.
(0 Комментарии)
 
Некоторая информация по настройке и установке Apache
Написал Алхимик   
Вторник, 12 Июль 2005

Итак, перед Вами по тем или иным причинам встала задача сделать WEB-сервер. Скорее всего, начальству надоело Ваше ежедневное сидение в Internet, и оно решило, что раз уж платит за пользование сетью, то из этого надо попытаться извлечь прибыль. Или Вы просто решили прославиться во всемирной сети, заработать кучу денег, купить последнюю модель Mersedes ... так или иначе - но WEB-сервер делать надо.

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

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

На сегодняшний день автору известны как минимум три подобных WEB-сервера : CERN, NCSA и Apache. Однако на сегодняшний день сервер CERN морально устарел и не развивается, про NCSA ходят подобные слухи - поэтому для рассмотрения в данной статье выбран сервер Apache, базирующийся на ранней версии NCSA и по настойке и функциональным возможностям сильно схож с ним.

Еще одна проблема для создателя русскоязычного WEB-сайта - проблема русской кодировки. На сегодняшний день их как-минимум четыре : Koi-8, CP-1251, ibm866 и iso8859-5. Можно, конечно, весь сервер хранить в кои - и точка. Однако, на взгляд автора, это неуважение к пользователям программы Windows. Наоборот, сервер, видный только в CP-1251 будет недоступен пользователям открытых систем. И именно Apache поможет Вам в решении этой проблемы.

Инициативная группа под руководством Дмитрия Крюкова взяла одну из ранних версий Apache, и пользуясь возможностью включения в код сервера внешних модулей, начала разработку так называемого RussianApache, позволяющего разработчику WEB-сайта не заботиться о кодировках, а сосредоточиться на разработке содержимого сайта, переложив заботу о кодировках на Вас ( как на администратора WEB-сервера ). И, отмечаю, RussianApache Вам в этом очень сильно поможет. Где взять?

Итак, Вам нужен WEB-сервер, причем именно RussianApache. Самый простой способ его достать - открыть любой WEB-броузер или воспользовавшись программой ftp зайти по адресу ftp://apache.lexa.ru/pub/apache-rus и взять последнюю версию WEB-сервера ( на момент написания статьи это 1.2.5rusPL21.4, файл 'apache_1.2.5rusPL21.4.tar.gz' ).

Далее необходимо определиться, в какой директории будет находиться программное обеспечение сервера. Группа разработчиков Apache считает, что это будет /usr/local/etc/httpd, автор предпочитает /usr/httpd ( чтобы далеко не лазить ). Оба этих решения абсолютно идентичны с точки зрения функционирования Apache, поэтому, чтобы не заострять на этом внимания, опишем переменную окружения

www% setenv HTTP_HOME /usr/httpd

и в дальнейшем будем пользоваться этой переменной для именования файлов Apache.

Теперь нужно собрать Apache. У вас в ${HTTP_HOME} лежит файл apache_1.2.4rusPL21.3.tar.gz, представляющий собой последнюю версию сервера. Перейдем в директорию /tmp и дадим команду :

www% gzip -c -d ${HTTP_HOME}/apache_1.2.5rusPL21.4.tar.gz | tar xvf -

Если у Вас в системе все настроено правильно, то у Вы увидете кучу файлов, которые развернутся в директории apache_1.2.5rusPL21.4.

Зайдите в директорию apache_1.2.5rusPL21.4/src и отредактируйте файл httpd.h : найдите в нем строчку

#define HTTPD_ROOT "/usr/local/etc/httpd"

и замените этот путь, где будет стоять Ваш Apache ( например, /usr/httpd ).

После этого необходимо применить стандартную процедуру сборки свободно-распространяемых программ. Для этого в текущей директории ( apache_1.2.5rusPL21.4/src ) дайте последовательность команд :

www% ./Configure
www% make

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

В результате вышеописанных действий у Вас должен получиться исполняемый файл, называющийся httpd. Это и есть Apache, который Вы так долго собирали. Но расслабляться рано - Apache, как и всякая нетривиальная программа ( а тривиальной программой можно считать программу, вычисляющую 2 плюс 2 ) для своей работы требует настройки.

Но, прежде чем приступать к настройке, скопируем Apache в его рабочую директорию :

www% cp httpd ${HTTP_HOME}
www% cd ..
www% cp -r LICENSE README conf htdocs icons support ${HTTP_HOME} . Настройка.

Итак, вспомним, что же у нас есть на настоящий момент :

  1. Определенная переменная окружения HTTP_HOME;
  2. файл ${HTTP_HOME}/httpd, представляющий собой собранный Apache;
  3. директория ${HTTP_HOME}/conf/, в которой будут лежать файлы конфигурации;
этого набора достаточно для успешной работы Apache. Создайте еще директорию ${HTTP_HOME}/logs для лог-файлов Apache - и в путь.

Первый файл, который нужен для работы Apache - ${HTTP_HOME}/conf/httpd.conf. В поставку входит пример такого файла ( ${HTTP_HOME}/conf/httpd.conf-dist ), но для того, чтобы хорошо научиться настраивать Apache, мы создадим его сами.

Итак, создайте этот файл и загрузите его в любой редактор ( автор использует textedit, но Вы можете воспользоваться любым другим, включая vi ). Первое, что нужно определить, это режим работы Apache.

Издавна повелось, что многие UNIX-сервисы запускались специальным демоном, который называют суперсервером Internet ( inetd ). Это демон слушал порты соответствующих сервисов, и при запросе определенного типа сервиса ( например, telnet или ftp ) запускал программу-демона, определенную для этого сервиса. Сделано это было в те времена, когда памяти в компьютерах было мало - и чтобы не держать в памяти множество сложных демонов, сеть слушал достаточно простой inetd.

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

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

ServerType standalone

Далее нужно задать порт, на котором Apache будет слушать запросы. По-умолчанию, это порт 80, и при стандартном обращении к Вашему серверу программа Netscape использует этот порт. Поэтому следующая наша строчка имеет вид :

Port 80

Считается, что все стандартные сервисы UNIX имеют номера портов меньшие 1024. Поэтому порты с номерами меньшими 1024 называют привилегированными портами, и открывать их позволено только суперпользователю. Сделано это для того, чтобы программа злоумышленника не смогла замаскироваться под стандартный сервис. Поэтому, задав для Apache 80-й порт, тем самым Вы обязали себя запускать его из-под суперпользоваетлся. Однако для нормального функционирования Apache вовсе не нужны привилегии суперпользвотеля. Более того, такой режим функционирования является достаточно опасным для системы, на которой работает Apache.

Привилегии суперпользователя нужны Apache только при старте - чтобы открыть 80-й порт - а далее он может функционировать под именем другого пользователя. Мы советуем Вам завести для него специального пользователя http, входящего в группу http и максимально уменьшить права этого пользователя в системе. В идеале, этот пользователь должен иметь доступ только к тем директориям, которые Вы хотите сделать видимыми через Ваш WEB-сервер. Создав пользователя, добавим в httpd.conf строчки :

User http
Group http

обязав тем самым Apache работать от имени этого бесправного пользователя.

Далее надо задать имя сервера, на которое будет откликаться Вас сервер. Делается это директивой

ServerName www.your-domain.ru

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

DocumentRoot /usr/httpd/htdocs

( здесь предполагается, что все Ваши документы находятся в директории /usr/httpd/htdocs. Мы так-же рекомендуем задать имеено эту директорию, если у Вас еще нет никаких документов - в /usr/httpd/htdocs находится стандартное руководство в HTML-формате, поставляемое с дистрибутивом Apache ).

В принципе, этого было бы достаточно, если бы не одна тонкость. Разработчики Apache, понимая, что при существующих порядка 150-ти директивах указание их в одном файле сделало бы его плохо-читаемым, решили упростить жизнь пользователям. Они предполагают, использование 3-й файлов : httpd.conf ( общие директивы конфигурации сервера ), srm.conf ( конфигурация ресурсов сервера - информация о том, где расположены документы, как их обрабатывать и подобная информация ) и access.conf ( конфигурация доступа к серверу - пароли, права на определенные директории ) - однако при запуске Apache определяет только положение файла httpd.conf. По-умолчанию, это ${HTTP_HOME}/conf/httpd.conf, имеется возможность переопределение местоположения этого файла. А вот расположение остальных 2-х файлов Apache ищет в httpd.conf. Но так как в нашей конфигурации эти файлы не нужны ( мы всю работу Apache опишем в httpd.conf, то мы просто отключим остальные файлы :

AccessConfig /dev/null
ResourceConfig /dev/null

Все, у нас получился работающий WEB-сервер ! Запускаем ( в этом месте необходимо воспользоваться правами пользователя root:

www# /usr/httpd/httpd
www#

У Вас получился работающий WEB-сервер ! Можете запустить Netscape и набрать в нем адрес сервера http://www.your-domain.ru - и Вы увидете свои документы.

Однако это, конечно, не все. Мы освоили только простейшую настройку Apache. О подробном конфигурировании WEB-сервера Apache мы поговорим в следующей статье.

(0 Комментарии)

 
КАК ИНСТАЛЛИРОВАТЬ И ТЕСТИРОВАТЬ SAMBA
Написал Алхимик   
Вторник, 12 Июль 2005

КАК ИНСТАЛЛИРОВАТЬ И ТЕСТИРОВАТЬ SAMBA
=======================================


ШАГ 0. Читайте руководство.Оно содержит множество полезной информации
которая может помочь вам начать работу. Если вы не знаете как прочитать
руководство , то тогда попробуйте что-нибудь подобное :

nroff -man smbd.8 | more

ШАГ 1. Создание бинарных файлов.

Во-первых, отредактируйте файл source/Makefile. В нем вы найдете что samba
может работать на множестве unix OS  и вам необходимо будет раскоментировать
ту строчку , которая соответствует вашей ОС.
Вы так же должны редактировать секцию в верху Makefile , которая определяет
куда будет инсталлированна samba. Там же устанавливаются пути к вашим лог
файлам и так далее. Проверьте что все введено правильно и каталоги
существуют.
После чего выполните команду "make". После чего будут созданы исполняемые
файлы. После того как эта команда завершилась корректно вы можете выполнить
команду "make install" для инсталляции исполняемых файлов и файлов помощи.
Вы можете разделить инсталляцию исполняемых файлов и файлов помощи использую
команды "make installbin" и "make installman". Заметте , что если вы
обновляете предыдущую версию samba , то вы должны знать что старые версии
исполняемых файлов  будут переименованы с расширением .old. Вы можете
вернуть предыдущую версию с помощью команды "make revert".

ШАГ 2. Самый важный шаг.

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

Если вы уже имеете установленную samba , то пропустите этот шаг . ;)

ШАГ 3. Создание файла конфигурации smb.conf.

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

Самый простой файл конфигурации будет что-нибудь типа :

   workgroup = MYGROUP

   [homes]
      guest ok = no
      read only = no

который будет позволять присоединятся к серверу любому пользователю с
acount'ом на сервере , использующему свое имя для входа в систему или имя
службы "homes" .(Замете , что  я так же установил рабочую группу , в которую
входит и сама samba). Для получения большей информации смотри ROWSING.txt

Замете , что команда "make install" не будет инсталлировать файл smb.conf.
Вам необходимо будет создать его самим . Вам так же и необходимо будет
создать путь , определенный в Makefile для logs и т.д., такой как /usr/local/samba.

Проверьте , что вы установили файл smb.conf в том месте , которое вы
определили в файле Makefile.

ШАГ 4. Тестирование вашего файла smb.conf с помощью testparm.

Важно что бы вы протестировали ваш файл конфигурации smb.conf используя
программу testparm. Если testparm сообщил вам  "OK" , то после этого он
выдаст вам список используемых служб. Если же нет , то вы получите сообщение
об ошибке.

ШАГ. Запуск smbd и nmbd.

Вы должны выбрать как запускать smbd и nmbd или как демона или из файла inetd.
Не пытайтесь запустить сразу же оба варианта. Или вы можете установить их в
inetd.conf и иметь запрос на их запуск из inetd, или вы можете запускать их
как демонов или из командной строки или из /etc/rc.local. Для получения всех
опций смотрите руководство пользователя ( man ).
Основным преимуществом запуска smbd и nmbd как демонов заключается в том ,
что они при этом более быстро отвечают на запрос инициализации соединения.
Но это , однако , иногда не решает проблем.

Шаг 5a. Запуск из inetd.conf

ЗАМЕЧАНИЕ;
NOTE; The following will be different if you use NIS or NIS+ to
distributed services maps.
Посмотрите ваш файл /etc/services. Что определено для порта 139/tcp ? Если
ничего то определите его добавив строку вида:

netbios-ssn     139/tcp
так же для 137/udp вы должны иметь строку:

netbios-ns 137/udp

После чего отредактируйте ваш файл /etc/inetd.conf  добавте в него две
строки:

netbios-ssn stream tcp nowait root /usr/local/samba/bin/smbd smbd
netbios-ns dgram udp wait root /usr/local/samba/bin/nmbd nmbd

Точный синтаксис файла /etc/inetd.conf меняется от unix к unix. Для
руководства посмотрите другие строки файла inetd.conf.

ЗАМЕЧАНИЕ: некоторые unix уже имеют  строку типа netbios_ns (обратите
внимание на подчеркивание _)в файле /etc/services. Вы должны отредактировать
или файл /etc/services или /etc/inetd.conf для того что бы стоки о samba
были однотипными.

ЗАМЕЧАНИЕ : многим вaшим системам может быть необходимо использовать опцию  
"interfaces" в файле smb.conf для определения IP адреса и сетевой маски
вашего интерфейса. Если вы не знаете какой broadcast адрес для вашей сети,
запустите ifconfig , имея права пользователя root. nmbd пытается определить
его во время запуска , но при этом неудачно в некоторых unix системах.
Если вам необходимо это сделать , то смотрите секцию "testing nmbd" для
метода его поиска.

!!!ВНИМАНИЕ!!! Во многих системах unix доступно только 5 параметров в
командной строке в файле inetd. Это подразумевает что вы не должны
использовать пробелы между опциями и аргументами , или должны использовать
скрипт и запускать его из inetd.

Перезапустите ined , возможно просто послав ему сигнал HUP. Если вы имеете
уже ранее установленную версию nmbd , то вам так же придется убить и ее .

Шаг 5b. Альтернатива: запуск smbd и nmbd как демона.

Для запуска сервера в качестве демона вы должны создать скрипт , возможно он
будет называться "startsmb"

#!/bin/sh
/usr/local/samba/bin/smbd -D
/usr/local/samba/bin/nmbd -D

Сделайте его выполняемым с помощью команды

chmod +x startsmb

После чего вы можете запускать startsmb запуская его вручную или из файла
/etc/rc.local. Для его удаления необходимо послать сигнал удаления процессам nmbd и smbd.

ЗАМЕЧАНИЕ: Если вы используете систему инициализации типа SVR4 , то тогда можете
посмотреть пример срипта для создания Samba для этой системы в examples/svr4-startup

ШАГ 7. Получение совместно используемых ресурсов на вашем сервер
      c помощью команды

smbclient -L yourhostname

В ответ вы должны получить список всех доступных совместно используемых
ресурсов на вашем сервере. Если вы их не получаете , то значит какой-нибудь
из шагов установки произведен неверно. Замете , что это способ может быть
использован так же и для просмотра используемых ресурсов доступных на других
клиентах LanManager (таких как WfWg).

Если вы выбираете пользовательский уровень безопасности (user level
security), то тогда вы можете заметить , что Samba требует введения пароля
перед тем как показать список совместно используемых ресурсов. Для получения
большей информации смотрите документацию по smbclient ( вы можете получить
список используемых ресурсов и без введения пароля если добавите в командной
строку опцию -%U . Эта опция работает только с Samba серверами.)

ШАГ 8. Попробуйте присоединится к серверу с помошью unix клиента:

smbclient '\\yourhostname\aservice'

Обычно  "yourhostname" будет именем хоста , на котором вы установили  smbd.
А "aservice"   любая служба , которую вы определили в файле конфигурации
smb.conf. Попробуйте просто свое имя пользователя если вы имеете в файле
sbm.conf секцию [homes] .

Например , если ваш unix хост имеет имя mambi и ваше имя в системе fred , то
вы должны набрать :

smbclient '\\bambi\fred'

ЗАМЕЧАНИЕ: Число слешев зависит от типа шелла , который вы используйте .
С некоторыми типами шеллов возможно вам будет нужно ввести строку
'\\\\bambi\\fred' .

ШАГ 9. Попробуйте присоединится с помощью других клиентов dos/WfWg/Win95/NT/os-2.
Попробуйте смонтировать диски:

net use d: \\servername\service

Попробуйте напечатать :

net use lpt1: \\servername\spoolservice
print filename

Радуйтесь или пошлите мне bug report!

ЧТО ЕСЛИ ОНО НЕ РАБОТАЕТ ?
==========================

Если ничего не работает и вы начинаете думать "кто писал эту кучу дряни (pile of
trash)" , то я снова предложу вам выполнить шаг 2 , до тех пор пока вы
не успокоитесь. 

После чего вы должны прочитать файл DIAGNOSIS.txt.rus и FAQ. Если вы все еще не
решили проблему , то тогда попробуйте подписаться на список рассылки (mailing
list) или на соответствующую конференцию (newsgroup) (для получения большей
информации смотрите README).
Samba удачно установлена на тысячах компьютеров во всем мире ,и может быть
кто-нибудь  имел сходную проблему и удачно преодолел ее.
Вы так же можете использовать WWW сайты для изучения выпусков Samba-дайджест
(samba-digest).
Когда вы решите проблему , пожалуйста пошлите мне некоторые изменения для
документации (или исходного кода), для того чтобы следующим пользователям можно
было легче решить ее.

ПРОБЛЕМЫ ДИАГНОСТИКИ.
=====================
Если вы имеете проблемы при инсталляции ,то тогда обратитесь к DIAGNOSIS.txt
пытаясь найти причину проблемы.

SCOPE IDs
=========

По умолчанию  Samba использует пустой scope ID. Это подразумевает , что все
ваши windows ящики (boxes) так же должны иметь пустой scope ID. Если вы
действительно хотите использовать не пустой scope ID , то вам необходимо
для nmbd ,smbd и smbclient использовать  опцию  -i . Для нормальной
работы всем вашим PCs будет необходимо иметь такие же настройки. Я не
рекомендую использовать scope IDs

(0 Комментарии)

 
Установка и настройка связки Apache+PHP+MySQL
Написал Алхимик   
Вторник, 12 Июль 2005

Итак, нам необходимо организовать http - сервер с возможностью выполнения скриптов и доступа из скриптов до какого-либо SQL сервера. В качестве http-сервера обячно выбирают apache, как наиболее продвинутый и развиваемый сервер для юникс-платформ. Для выполнения скриптов тоже есть куча версий языков (начиная от бэйсика и заканчивая явой), я выбрал php, как наиболее удобный и красивый для _меня_ в плане написаня программ. Ну а выбор SQL серверов для вас огромен. Я выбрал MySQL - так как для моих целей он вполне подходит (нагрузки у меня огромной не предвидится ;-)) да и бесплатный он, в отличие от того-же Oracle ;-). Итак, начнем делать связку apache+php+MySQL. Для этого нам необходимо иметь сконфигуренное ядро линукса (прграммам требуется некоторые файлы оттуда), Perl и собственно сами программы. Найти вы их можете либо у меня, либо по поисковикам (apache*, php*, mysql*).
Скачал и развернул MySQL. К сожалению, последняя версия MySQL у меня не захотела компилиться и собираться, поэтому я взял mysql-3.21.33b.

   ./configure --with-charset=koi8_ru

Сконфигурил MySQL с поддержкой русского языка в кодировке КОИ-8 по умолчанию (там есть много кодировок, посмотрите по configure --help). После создания всех конфигов, я сделал make;make install и пока на этом успокоился. Скачал (с apache.lexa.ru) и развернул apache_1.3.4rusPL28.6. В этом файле уже сразу пропатчены нужные файлы для поддержки русского языка. Если же вы предпочитаете патчить исходные версии - то посмотрите на INSTALL.rus ;-). Ниже я его просто вставлю.Да, и еще один довод в пользу именно именно этой версии - тут наконец-то сделана нормальная перекодировка и при соответствующих настройках русские странички, отданные этим сервером, тепрь нормально оседают в кешах. В старых версиях приходилось писать скрипты. За подробностями обращайтесь на apache.lexa.ru в раздел FAQ ;-).
1) скачать дистрибутивный Apache
     less INSTALL; less README.configure
     ./configure --help
     ./configure ...options
     make
     make install
2) установка из комплекта 'дистрибутивный Apache + patches_n.n.n.rusPLNN.M'
    a) распаковать дистрибутивный Apache:
       tar xzvf apache_1.3.0.tar.gz
    b) распаковать 'Русские' правки (предположим, их версия NN.M)
       cd apache_1.3.0
       tar xzvf ../patches_1.3.0rusPLNN.M.tar.gz
    c) прочитать этот файл
    d) наложить 'русские' патчи
    patch -p0
В общем, получил исходники русского Апача. Зашел в каталог с исходниками,
   сказал configure ;-)
    Больше пока ничего не делайте с гордым индейцем ;-). Не надо его
   компилировать и устанавливать, сначала включим нужные нам модули.
   Cкачал php c www.php.net, развернул его , сказал ему
./configure --with-mysql --with-apache=../apache_1.3.4rusPL28.6 --with-mod_charset

Этой командой мы конфигурируем PHP для работы с MySQL (кстати, никто не мешает сконфигурить его для работы с несколькими разными SQL серверами), указываем каталог с апачей и говорим конфигурялке, что апача у нас русская.
   make
   make install

Все, PHP у нас установлен .... Теперь снова идем в каталог с апачей ;-).
   ./configure --activate-module=src/modules/php3/libphp3.a

Этим мы подключаем модуль PHP к апаче. Теперь спокойно говорим make. Апач начинает собираться. После сборки проверьте, на месте ли модули, зайдите в каталог src, скажите
   ./httpd -l

    .............
    mod_charset.c
    .............
    mod_php3.c
    .............

Обратите внимание .... в этом списке обязательно должны быть эти модули. Первый обеспечивает автоматическую перекодировку, второй как раз php ;-). Потом make install - апач поставится в /usr/local/apache. Опять оставим в покое апач из каталога с исходниками php возьмем файл php3.ini-dist и положим его в каталог /usr/local/lib/php3.ini. Теперь его можно посмотреть и отредактировать (Единственное, что я там сделал, так отконфигурировал порты и пользователей по умолчанию для MySQL). Теперь пришла пора окончательной настройки индейца .... идем в каталог /usr/local/apache/conf и начинаем править файлик httpd.conf. Здесь я приведу, что я правил в оригинальном файле. Я расскомментировал строчку
   AddType application/x-httpd-php3 .phtml

что бы phtml файлы опозновались и работали нормально Я заккоментировал строчку Port 80 и расскомментировал следующие строчки
    Listen 80
    Listen 8100
    Listen 8101
    Listen 8102
    Listen 8103
    Listen 8104
    CharsetByPort koi8-r 8100
    CharsetByPort windows-1251 8101
    CharsetByPort ibm866 8102
    CharsetByPort iso-8859-5 8103
    CharsetByPort x-mac-cyrillic 8104

Этим я разрешил серверу сидеть на 81* портах и жестко привязал перекодировку к соответствующим портам. Теперь расскомментируем следующие строчки
   # "AutoRedirect" setup
   #
   CharsetAutoRedirect koi8-r :8100
   CharsetAutoRedirect windows-1251 :8101
   CharsetAutoRedirect ibm866 :8102
   CharsetAutoRedirect iso-8859-5 :8103
   CharsetAutoRedirect x-mac-cyrillic :8104
   CharsetNormalizeTypes image/ application/ video/ audio/
   CharsetNormalizeToURL :80 200

Этими строчками мы как раз обеспечиваем правильную переадресацию и перекодировку, да так, что бы перекодированные странички оседали в кэше. ;-) ну заодно и кнопочки Back на формах в браузерах будут работать ;-) (будет сохраняться информация в формах). Затем я создал /etc/rc.d/rc.httpd. По умолчанию этот файлик в Slackware вызывается из rc.M (если у него стоит бит выполняемости) . В нем записана следующия строчка
   /usr/local/apache/bin/apachectl start

Этот скрипт пускает httpd сервер, соответственно stop его останавливает ;-) Теперь заставим так же по умолчанию пускаться MySQL. Сначала надо установить базы по умолчанию, в которых MySQL держит все свои настройки. Заходим в каталог с дистрибутивом, затем в каталог scripts, оттуда запускаем mysql_install_db , создадутся нужные каталоги, перепишутся нужные файлы и запустится MySQL сервер ;-)) Теперь надо придумать, куда запихать загрузку , я сделал в каталоге /etc/rc.d файл rc.sql и сделал его выполняемым, внутри поставил вызов
   /usr/local/bin/mysql.server start

и в rc.M перед вызовом апача прописал следующие строки
   # Start MySQL server:
   if [ -x /etc/rc.d/rc.sql ]; then
     . /etc/rc.d/rc.sql
   fi

Надо именно перед ... почему ? Ну во-первых, серверу надо некоторое время, что бы сервер запустился, а потом ... вдруг у вас сразу же после загрузки пойдут запросы к базе ;-). Ну и теперь обеспечим нормальный шутдаун серверов ;-) Ведь нам надо красиво закрыть систему .. я не нашел лучшего места, чем начало файла /etc/rc.d/rc.6, сразу после PATH (Если вы знаете лучшее место, напишите мне ;-)
   echo
   echo "Shutdown the MySQL server"
   /usr/local/bin/mysql.server stop
   echo "Shutdown the Apache"
   /usr/local/apache/bin/apachectl stop

Теперь не забудьте поменять пароль root для MySQL (не путать с паролем root в системе !!) Делается это так
mysql -u root -e "update user set password=password('new_password') where user='root'" mysql

Где новый пароль - new_password, также пропишите его в mysql.server в строчке mysql_root_pwd=new_password. Это необходимо для того, что бы этот скрипт мог нормально управлять сервером. Затем сказать mysqladmin reload, что бы изменения вступили в силу ( вообще-то эта комманда перезагружает сервер, сброс файла паролей можно было сделать по другому, но мне так больше нравится) Необходимо также сменить права mysql.server на 600, что-бы обезапаситься от нехороших юзверей

(0 Комментарии)

 
<< В начало < Предыдущая 1 2 3 4 5 6 7 8 9 10 Следующая > В конец >>

Всего 82 - 90 из 128

 


Реклама | Контакты | ©2005-2013 Алхимик