Академический Документы
Профессиональный Документы
Культура Документы
Корпоративный Интернет-сервер
на базе ОС FreeBSD.
Киев - 2008
1. Введение 4
1.1. Краткая история FreeBSD 4
1.2. Преимущества FreeBSD 5
1.3. Для кого эта книга 6
2. Инсталляция FreeBSD 7
1.4. Создание загрузочных дискет 7
1.5. Создание разделов на жёстком диске 7
1.6. Выбор Distributions и Packages 9
3. Базовая настройка FreeBSD 10
1.7. Создание пользователя с правами root 10
1.8. Проверка и настройка сети (ifconfig) 10
1.9. Если провайдер выдаёт ADSL (ppp) 11
1.10. Редактирование параметров загрузки (/etc/rc.conf)
12
1.11.Конфигурирование ядра 13
1.12. Настройка обновления дерева портов (cvsup)
13
1.13. Настройка службы DNS (named)
14
1.14. Настройка почтовой службы (sendmail)
15
1.15. Установка и базовая настройка proxy-сервера (squid)
16
1.16. Обновление индексной базы поиска файлов (locate) 16
1.17. Справочная система FreeBSD 16
1.18. Завершение базовой настройки FreeBSD 17
4. Дальнейшая настройка FreeBSD 18
1.19. Антивир
усный контроль почты (sendmail + drweb) 18
1.20. Работа почты по протоколу IMAP (sendmail + dovecot)
18
1.21. Борьба со спамом (sendmail + spamassassin)
19
1.22. Настройк
а ftp-сервера (ftpd) 21
1.23. Защита сети -firewall (ipfw)
22
1.24. Более тонкая настройка proxy-сервера (squid)
23
1.25. Установка и настройка web-сервера (apache)
25
1.26. Популярная связка apache + php + mysql
25
1.27. Web-
интерфейс для доступа к почте (openwebmail, squirrelmail) 26
1.28. Держим у себя файл зоны (первичный DNS) 26
1.29. Соединения через сокет (socket) 27
1.30. Организуем виртуальную локальную сеть (ipsec) 27
1.31. Второй способ организовать VPN (openvpn) 27
1.32. Беспрепятственное копирование файлов между серверами FreeBSD 28
1.33. Графики статистики использования сетевого трафика (mrtg) 28
1.34. Подсчёт и ограничение трафика пользователей (ipa) 29
1.35. Настройка общения с сервером по sms 33
1.36. Завершение полной настройки FreeBSD - наводим красоту 34
5. Инструменты на каждый день 35
1.37. Работа с файлами в shell
35
1.38. Пользователи, группы и права доступа
37
1.39. Текстовый редактор vi
39
1.40. Программирование в shell
41
1.41. Справоч
ник по командам и конфигурационным файлам 48
6. Заключение 50
3
1. Введение
1.01. Краткая история FreeBSD
4
Второй проект породил FreeBSD. В этой разработке внимание было сконцентрировано на
том, чтобы система стала проще в использовании. Иначе говоря, эта система была
ориентирована на широкий круг пользователей и на платформу Intel x86. Сегодня FreeBSD -
самая известная UNIX-система из семейства BSD.
Причин для того, чтобы использовать в своих задачах FreeBSD масса. Рассмотрим
же самые основные ее преимущества и недостатки.
Итак, главным преимуществом FreeBSD мы, безусловно, считаем её стабильность.
По данным компании Netcraft (netcraft.com), изучавшей сайты с самым продолжительным
календарным временем беспрерывной работы, из 50 первых в её списке сайтов 47
функционирует под управлением FreeBSD. С момента последней перезагрузки Web-
сервера №1 прошло уже более 5 лет! И, конечно же, он работает под FreeBSD.
Второе неоспоримое преимущество - это то, что FreeBSD бесплатная система, не
обременяющая пользователя дорогой лицензией. Вы можете бесплатно установить копию
FreeBSD на всех своих компьютерах, сколько бы их ни было. Если вы устанавливаете
сервер, вам не потребуется платить за каждое дополнительное сетевое подключение, как в
некоторых коммерческих операционных системах.
Третье - это доступность тысяч бесплатных пакетов прикладных программ всегда в
режиме online! Эти свободно распространяемые программы элементарно устанавливаются
из дерева портов всего двумя командами - система сама найдёт нужные дистрибутивы и
патчи в сети и скомпилирует всё, что нужно на вашу FreeBSD. Требуется только
подключение к Интернет.
Четвёртое - это открытость системы. Доступно всё дерево исходного кода ОС
FreeBSD, в код можно вносить изменения, выполнять любые проверки и т.д.
Ну и наконец, показателем качества является то, что системой FreeBSD пользуются
крупнейшие компании и интенсивно используемые Web-сервисы.
5
аппаратным ресурсам. В Windows же предпочтение отдается простоте эксплуатации, а не
производительности и эффективному использованию аппаратных средств.
Что касается Linux, то об этой системе сейчас знают все, впрочем, как и о Windows.
В последнее время она стала особенно популярной. Фактически Linux- это клон UNIX. Как и
FreeBSD, это открытая операционная система, разработанная добровольцами из разных
стран мира. У FreeBSD и Linux много общего, однако, для Linux создано больше программ,
чем для FreeBSD, но последняя, в свою очередь, позволяет запускать практически все
программы, разработанные для Linux. Более того, под FreeBSD они работают даже
быстрее, чем под Linux. Что касается политики разработки и поддержки, то у FreeBSD
только один дистрибьютор, а у Linux их более 30. FreeBSD будет работать одинаково на
любой системе. В случае с Linux это не так. У каждого дистрибьютора свой подход, что
нередко вводит пользователей в заблуждение, когда они переходят с одного дистрибутива
Linux на другой. FreeBSD является полноценной ОС, поддерживаемой основным составом.
Linux - это только ядро, поддерживаемое Линусом Торвальдсом (создателем Linux).
Компании, занимающиеся распространением Linux, комплектуют свои дистрибутивы целым
рядом программ, специально разработанных для Linux и, естественно, каждый
дистрибьютор имеет собственное мнение относительно того, что должно входить в
дистрибутив. Кроме того, процесс обновления кода FreeBSD отслеживается и
координируется намного тщательнее, чем в Linux. Для большинства пользователей это
позитивное явление, поскольку они уверены в том, что код был протестирован
специалистами на отсутствие проблем. Поскольку в системе FreeBSD поддерживается одно
дерево исходного кода, она стабильнее Linux и в большей степени соответствует
производственным целям. Основным недостатком FreeBSD, вызванным таким подходом,
является то, что нововведения допускаются в систему медленней, чем в Linux. Но есть
выбор: либо вы предпочтёте стабильность и неприступность ОС, либо остановите свой
выбор на модных вещичках и новых игровых устройствах, пожертвовав ради этого
надежностью.
6
И последнее, в данной книге мы используем дистрибутив FreeBSD версии 6.3 -последней
вышедшей стабильной версии на момент написания книги. Удачи... :)
2. Инсталляция FreeBSD
В офисных условиях ОС FreeBSD можно установить двумя основными способами - с
загрузочных CD-дисков, либо с ftp-сервера, однако, в последнем случае, необходимо
создать ещё загрузочные дискеты. Если вы планируете устанавливать ОС с CD-дисков, то
можете пропустить следующий раздел о загрузочных дискетах.
Необходимо загрузить файл boot.flp и файлы kernlflp, kern2.flp, kern3.flp. Если загрузочные
диски предполагается создавать в системе DOS или Windows, также потребуется
программа fdimage.exe, расположенная в каталоге: /рглЬ/FreeBSD/ tools/
isk: adB Partition паме: adBsl Free: В blocks (8MB) Size Newfs
art Mount
Part Mount Size Newfs
dBsla / 512MB UFS2 Y
dBslb swap 512MB SwAP 1B24MB UFS2+S Y
dBsld /trip 2B48MB UFS2+S Y 1B24MB UFS2+S
dBsle /uar Y 5119MB UFS2+S Y
dBslf /поме
dBslg /usr
"he following coMMands are valid here (upper or lower Z = CustoM Newfs H =
case) ! = Create В = Belete M = Mount pt. Belete+Merge
Newfs Opts Q = Finish Toggle S = Toggle SoftUpdates A =
Newfs U = Undo Auto Befaults
И это почти всё уже. Нам остаётся выбрать тип установки - с ftp или компакт-диска (меню
«Media») и, если ставим с ftp, то надо выбрать источник установки ftp-сервер ну и
настроить сеть в соответствии с вашими текущими параметрами для того, чтобы до этого
самого ftp можно было добраться (IP-адрес, шлюз, DNS).
После установки этих пакетов остаётся выбрать свой часовой пояс - меню «Time Zone» и
всё готово. Выходим из программы Sysinstall и перезагружаемся (предварительно вытащив
дискеты и CD-диски). Если система выдает вам приглашение «login:», то всё прошло
успешно (рис.3).
itarting devd.
ш.acpi.cpu.cx_lowest: Cl -> Cl
Ienerating nsswitch.conf.
Ienerating host.conf.
lounting NFS file systeMs:.
Ireating and/or trinning log files:.
Starting syslogd.
!LF ldconfig path: /lib /usr/lib /usr/1ib/conpat /usr/local/1 ib
j.out ldconfig path: /usr/1 ib/aout /usr/1ib/conpat/aout
Initial i386 initialization:.
Additional FIB I support:.
Starting local daeMons:.
Jpdating Motd.
"lounting late file systeMs:.
Configuring syscons : кеумар blanktiMe.
Starting cron.
Local package initialization:.
Additional TCP options:.
Starting background file systeM checks in 68 seconds.
Sun Jun 17 19:38:39 EEST 2BB7
login: I
9
Так как вся работа в системе FreeBSD будет происходить в текстовом режиме, то и
скриншоты в книге, в принципе, больше не имеют смысла, а значит «картинок» больше не
будет. Продолжим.
Система последовательно будет задавать вопросы о логине, полном имени и т.д. В ответ на
вопрос о группе, введите wheel - это название администраторской группы. В ответ на
вопрос о shell, введите bash. Всё остальное можно оставить, как есть. Не забудьте создать
себе сразу пароль. Далее нужно разрешить пользователям из группы wheel получать в
системе администраторские права:
# visudo
Сохранить и выйти из редактора vi - команда: :wq [Enter]. Здесь и далее -для того, чтобы
понять, как работать в текстовом редакторе vi, прочитайте главу 5.03.
Теперь можно и даже нужно выйти из системы (Ctrl-D) и зайти уже под своим именем.
Никогда не работайте в UNIX под пользователем root - на то есть много причин и, кроме
того, это считается плохим тоном. После входа в систему, получаем права root: $ sudo —s
#
10
Вы должны увидеть список сетевых интерфейсов системы, среди которых есть ваши
сетевые карты (fxpO и ео!0). Присвоим нашему серверу внутренний IP 10.0.0.1, а внешний
-тот, который выдал провайдер. Для этих целей используется команда ifconfig:
#1 ifconfig fxpO inet 10.0.0.1 netmask 255.255.255.0
#2 ifconfig edO inet 222.111.33.100 netmask 255.255.255.252
Теперь мы должны «увидеть» и нашу локальную сеть и мир. Проверяем обычной для всех
командой ping:
# ping freebsd.org
PING freebsd.org (69.147.83.40): 56 data bytes
64 bytes from 69.147.83.40: icmp_seq=0 ttl=41 time=207.519 ms
64 bytes from 69.147.83.40: icmp_seq=l ttl=46 time=201.388 ms
provider name:
set device PPPoE:edO
set authname ppp login
set authkey ppp password
set dial
set login
add default HISADDR
При этом в системе появится виртуальный сетевой интерфейс tunO, и весь трафик
логически будет проходить именно через него, а не через edO. В рамках данной книги мы
будем описывать традиционное подключение к сети Интернет, т.е. работать с
11
существующими физическими интерфейсами ео!0 и fxpO. Таким образом, если у вас ADSL,
то просто меняйте в дальнейших сетевых настройках ео!0 на tunO там, где это нужно.
Всё, что мы сделали до этого момента вручную, нужно прописать в файле /etc/rc.conf - это
основной файл параметров загрузки системы. Сейчас самое время придумать имя вашему
серверу. Наверняка у вас есть какой-то домен, частью которого вы планируете быть. Не
забудьте, что «как вы сервер назовёте, так он и будет работать»... Допустим, у вас есть
почтовый домен mail.ua и вы хотите назвать свой сервер elbrus. Пропишите в файле зоны
вашего домена хост elbrus.mail.ua (как это делается читайте в разделе 3.07) и вперёд:
# vi /etc/rc.conf
sshd_enable="YES"
inetd_enable="YES"
gateway enable="YES"
sendmail enable="YES"
hostname="elbrus.mail.ua"
ifconfig_fxpO="inet 10.0.0.1 netmask 255.255.255.0"
ifconfig_ed0="inet 222.111.33.100 netmask 255.255.255.252"
defaultrouter="222.111.33.99"
named_enable="YES"
natd_enable="YES"
natd interface="ed0"
firewall_enable="YES"
firewall type="/usr/local/etc/firewall.conf"
# vi /usr/local/etc/firewall.conf
add divert natd ip from any to any via edO
# vi /etc/rc.conf
sshd_enable="YES"
gateway enable="YES"
sendmail enable="YES"
hostname="elbrus.sint.ua"
ifconfig_fxp0="inet 10.0.0.1 netmask 255.255.255.0"
ppp_enable="YES"
ppp mode="background"
ppp profile="provider name"
named_enable="YES"
natd_enable="YES"
natd interface="tun0"
firewall_enable="YES"
firewall type="/usr/local/etc/firewall.conf"
# vi /usr/local/etc/firewall.conf
add divert natd ip from any to any via tunO
12
Некоторые строки в /etc/rc.conf мы прописали наперёд, чтобы потом не останавливаться
ещё раз на этом файле, читайте дальше и вы должны понять что к чему. Далее в книге мы
не будем больше так подробно останавливаться на вариациях с ADSL, т.к. надеемся, что
для читателя это элементарно и понятно. Итак, настраиваем дальше.
Это очень ответственная процедура и перед тем, как начать редактировать ядро, нужно для
самого себя понять «зачем». В нашем случае нужно включить поддержку NAT на уровне
ядра (для работы в режиме прозрачного шлюза), FIREWALL (фильтр сетевых пакетов) и
IPSEC (для связки удалённых хостов в виртуальную сеть). Текстовый файл ядра, которое
работает сейчас, находится здесь: /usr/src/sys/i386/conf/GENERIC. Скопируем его и
добавим нужные нам строки в соответствующие разделы файла:
#3 cd /usr/src/sys/i386/conf/
#4 ср GENERIC ELBRUS
options IPFIREWALL
options IPFIREWALL FORWARD
options IPFIREWALL DEFAULT TO ACCEPT
options IPDIVERT
options DUMMYNET
options IPSEC
options IPSEC ESP
options IPSEC DEBUG
# config ELBRUS
cd ../compile/ELBRUS/
# make cleandepend
make depend
# make
# make install
Четыре последние команды можно объединить в одну строку (об операторе && позже): #
make cleandepend && make depend && make && make install
13
установке) и make install (установить в систему). Естественно, что дерево портов
желательно держать в актуальном состоянии. В этом нам поможет программа cvsup.
Установим её же из портов:
#5 cd /usr/ports/net/cvsup-without-gui/
#6 make && make install
Находим файл ports-supfile, копируем его в свой домашний каталог, редактируем его и
запускаем процедуру обновления дерева портов:
#7 ср /usr/share/examples/cvsup/ports-supfile /home/admin/
#8 vi /home/admin/ports-supfile
*default host=cvsup2.ua.FreeBSD.org
# cvsup -g -L 2 /home/admin/ports-supfile
Это нужно для того, чтобы наш сервер мог сам обрабатывать dns-запросы пользователей, а
так же, если понадобится, держать у себя доменные зоны. Нам нужен правильно
работающий демон named, подправим его конфигурационный файл (нужно найти,
раскомментировать и отредактировать раздел forwarders): # cd /etc/namedb/
vi named . conf
forwarders {
222.111 0 l
222.111 0 2 ;
};
В принципе этого достаточно. Однако, можно ещё прописать у себя обратную зону нашей
локальной сети. Напомним в двух словах, что прямой DNS-запрос - это когда нужно узнать
IP-адрес по имени хоста, а обратный - когда нужно узнать имя хоста по его IP-адресу.
Некоторые программы (например sshd), при обращении к ним по сети, пытаются узнать имя
хоста, который к ним обращается и, если долго не получают ответа, могут завершиться по
таймауту. Обратная зона нашей локальной сети нужна для того, чтобы наш сервер каким-то
образом присваивал имена нашим локальным хостам. Как правило, в 99,9% случаев, это
не нужно, однако отметить стоит:
# vi named.conf
zone "0.0.10.IN-ADDR.ARPA" {
type master; file
"0.0.10.rev";
};
# vi 0.0.10.rev
$TTL 86400
0.0.10.IN-ADDR.ARPA. IN SOA elbrus.mail.ua. root.elbrus.mail.ua. (
20060606 ; serial
28800 ; refresh
1800 ; retry
604800 ; expire
8 6400 ) ; minimum IN NS
elbrus.mail.ua. $ORIGIN 0.0.10.IN-ADDR.ARPA.
$GENERATE 1-255 $ PTR local-$.mail.ua.
14
Можно тут же локально проверить, как работает ваш named. Следующая команда
выполнит dns-запрос к вашему серверу и вы должны увидеть ответ: # dig 0127.0.0.1
freebsd.org А
Для того, чтобы наш сервер мог принимать и отправлять почту, нужно немного поработать с
настройками sendmail, а именно: разрешить из локальной сети пользоваться им, как smtp,
прописать домены, для которых принимать почту извне, ограничить размер письма (не
обязательно, но полезно). Кроме того, нужно дать возможность пользователям забирать
почту по протоколу рорЗ. Итак:
#9 cd /etc/mail/
#10 ср access.sample access
#11 vi access
10.0.0 RELAY
# vi local-host-names
mail.ua
# vi sendmail.cf
О MaxMessageSize=4096000
# make maps && make restart
Чтобы создать почтовый ящик, нужно просто создать пользователя в системе. Если этот
пользователь создается только ради почты (ни ftp, ни shell ему не нужен), то можно не
пользоваться командой adduser, а получить прямой доступ к системной базе пользователей
и паролей:
# vipw
admin:3CpZ$jX:1001:0::0:0:User &:/home/admin:/usr/local/bin/bash
info:W3Y$vX0:7001:777::0:0:User &:/nonexistand:/sbin/nologin
15
Если вы хотите назначить псевдонимы почтовым ящикам - используйте файл
/etc/mail/aliases. Если же вы собираетесь принимать почту на одном сервере для разных
почтовых доменов и, при этом, хотите разделить пользователей - используйте файл
/etc/mail/virtusertable. После редактирования этих файлов, не забывайте сделать:
В UNIX-системах есть хорошая программа поиска файлов - locate. Однако, для того, чтобы
она работала, необходимо создать индексную базу файловой системы, которая
обновляется автоматически один раз в неделю, но, так как мы только установили наш
сервер, её ещё попросту нет. Команда для создания или ручного обновления следующая:
# /etc/periodic/weekly/310.locate
Теперь можно пользоваться командой locate для поиска файлов по всей системе:
# locate squid.conf
16
# man locate
Если не понятно, как пользоваться справкой, то есть даже для тех, кто в танке: #
man man
Вот собственно и всё, что касается основной базовой настройки системы. Когда закончатся
процессы компиляции нового ядра и обновления портов, просто перегрузите сервер, чтобы
запустилось собственно новое ядро, а с ним firewall, natd и всё остальное. Перегружаем
сервер любой из следующих команд:
#21 reb
oot или:
#22 shutdown —r now
Как вы догадались, перегружать сервер кнопкой Reset не рекомендуется, т.к. хоть FreeBSD
и надёжнее Windows, но всё-таки файловая система есть и там и там, а с любой файловой
системой завершать работу следует корректно. Для выключения компьютера используйте:
#25 halt
или:
#26 shutdown —h now
И, конечно же, это далеко не всё, что вам может понадобиться, и что вы можете получить,
работая с ОС FreeBSD. Движемся дальше.
Раз уж у нас появился сервер приёма электронной почты, то было бы неплохо сразу
настроить и антивирусный контроль входящих и исходящих писем. Использовать будем
антивирус DrWeb, т.к. он элементарно устанавливается из портов и не создаёт проблем в
процессе дальнейшей работы:
#39 cd /usr/ports/security/drweb-sendmail/
#40 make && make install
#41 vi /etc/mail/sendmail.cf
# Input mail filters О
InputMailFilters=drweb-filter
Xdrweb-filter, S=local:/var/drweb/run/drweb-smf.skt, F=T,
T=S:320s;R:32 0s;E:In
#42 killall sendmail
#43 /usr/local/etc/rc.d/drwebd start
#44 /usr/local/etc/rc.d/002.drweb-smf.sh start
#45 cd /etc/mail/
#46 make start
Для чего это нужно? Очень часто бывает так, что пользователь работает со своим
почтовым ящиком с разных компьютеров и при этом пользуется разными почтовыми
клиентами. В этом случае необходимо, чтобы вся почта пользователя находилась на
сервере. При этом, каждый раз, подключаясь к почтовому серверу, пользователь получает
только заголовки всех своих писем, а при необходимости может получить и прочитать
письмо целиком. Такая схема работы достигается при использовании протокола IMAP. Для
реализации мы предлагаем использовать программу dovecot:
#47 cd /usr/ports/mail/dovecot/
#48 make && make install
Собственно, это всё. Конфигурационный файл трудностей вызвать не должен, там всё
просто и понятно. Единственное, что остаётся сделать:
# vi /etc/rc.conf
dovecot_enable="YES"
#49 ср /usr/local/etc/dovecot-example.conf /usr/local/etc/dovecot.conf
#50 vi /usr/local/etc/dovecot.conf
18
ssl disable = yes #
/usr/local/etc/rc.d/dovecot start
######################################################################
### check relay -- check hostname/address on SMTP startup
######################################################################
######################################################################
19
### check_mail — check SMTP NMAIL FROM:' command argument
######################################################################
# make restart
Теперь в принципе всё готово. Для того, чтобы запустить систему в ручном режиме,
необходимо сначала остановить sendmail, запустить spamd + spamass-milter и затем снова
запустить sendmail (и не забыть подправить rc.conf):
# vi /etc/rc.conf
spamd_enable="YES"
spamass milter enable="YES"
#59 cd /etc/mail
#60 make stop
#61 /usr/local/etc/rc.d/spamass-milter start
#62 /usr/local/etc/rc.d/sa-spamd start
20
# make start
Всё должно заработать. Как проверить? Отправляем откуда-то извне письмо на свой
почтовый ящик, получаем его и внимательно читаем заголовок RFC-822. Там должно быть
написано и про DrWeb и про SpamAssassin. Можно ещё посмотреть лог самого sendmail: #
tail —n 50 /var/log/maillog
Теперь наш спам-фильтр сходу должен различить около 60 - 70% спама. Но это ещё не всё.
Для того, чтобы спам-фильтр заработал в полную силу, а это примерно 96 - 98% спама, его
необходимо обучить. Для этого создадим 2 почтовых ящика: spam - для перенаправления
на него писем, которые являются спамом, но не были помечены, как спам; и ham - для
перенаправления на него писем, которые были помечены, как спам ошибочно. Теперь
напишем скрипт для обучения встроенного Bayes и будем периодически перенаправлять на
эти ящики письма для обучения:
# vi /home/admin/scripts/sa_learn.sh
#!/bin/sh
sa-learn --spam /var/mail/spam
sa-learn --ham /var/mail/ham
exit 0
# vi /etc/crontab
0 22 * * * root /home/admin/scripts/sa-learn.sh
Очень часто бывает полезно иметь возможность попасть на свой сервер по ftp. Для того,
чтобы можно было попадать по ftp к себе в домашнюю директорию, нужно всего лишь
раскомментировать кое-что кое-где:
# vi /etc/inetd.conf
ftp stream tcp nowait root /usr/libexec/ftpd ftpd -1
# killall -HUP inetd
21
4.05. Зашита сети -firewall
Эта команда добавит правило с номером 200, которое запрещает любой tcp-трафик от
хоста 10.0.0.5 на любой другой хост по 110 порту. Т.е. пользователь 10.0.0.5 не сможет
подсоединиться ни к одному рорЗ-серверу в мире. Теперь предлагаем вашему вниманию
написанный нами, проверенный временем и отработанный в реальных условиях фаерволл.
Конечно же у каждого своя специфика работы, однако, вот вам базовая модель, которая
сразу подойдёт 90% из вас:
# vi /usr/local/etc/firewall.conf
add 100 divert natd ip from any to any via edO
add 10010 count ip from any to 222.111.33.100 in recv edO
add 10020 count ip from 222.111.33.100 to any out xmit edO
add 40000 allow ip from any to any via loO
add allow udp from any to any
add allow icmp from any to any
add allow tcp from any to any established
add allow ip from any to any frag
add allow tcp from any to any 22 setup
add allow tcp from any 20 to any setup
add allow tcp from any to any 21 setup
add allow tcp from any to any 25 setup
add allow tcp from any to any 110 setup
add allow tcp from any to any 143 setup
add allow tcp from any to me 80 setup
add allow tcp from me to any 80 setup
add allow tcp from me to any 443 setup
add allow tcp from 10.0.0.0/24 to me 3128 setup
add deny tcp from 10.0.0.0/24 to any 80
add allow tcp from any to any 1024-65535 setup
add 65500 deny ip from any to any
Здесь же опишем, как ограничить скорость трафика по определённым условиям (это нам
пригодится в дальнейшем):
22
#66 ipfw add pipe 1 tcp from any to 10.0.0.3 out
#67 ipfw pipe 1 config bw 32Kbit/s
Очень часто бывает так, что всем разрешать пользоваться Интернетом не стоит. Это очень
просто можно ограничить прямо в файле настройки squid:
# vi /usr/local/etc/squid/squid.conf
Можно ещё более усилить ограничение доступа - ввести проверку пароля пользователя
при попытке выйти в Интернет:
# vi /usr/local/etc/squid/squid.conf
23
redirect children 4
# vi /usr/local/etc/squid/squidGuard.conf
dbhome /var/db/squidGuard
logdir /usr/local/squid/logs
time workhours {
weekly mtwhfa 08:00 - 21:00
}
source admins {
ip 10.0.0.3
}
source users {
ip 10.0.0.0/24
}
rewrite media {
s@.*\.mp3$@http://10.0.0.1/replace/oblaka.mp3@i
s@.*\.avi$@http://10.0.0.1/replace/nikolaev.avi@i
log replace.txt
}
# DESTINATION CLASSES
acl {
admins {
pass any
}
users within workhours {
pass !ads !aggressive !audio-video !drugs !gambling !
hacking !mail !porn Iproxy Iviolence Iwarez any
redirect http://www.google.com
rewrite media
log squidGuard.txt
} else {
pass none
redirect http://www.google.com
log squidGuard.txt
} default
{
pass none
redirect http://www.google.com } }
# squid —к reconfigure
В секции «rewrite media» описана очень интересная вещь - подмена трЗ и avi файлов
своим, заранее заготовленным фаиликом. Таким образом, если какой-то вредитель захочет
скачать из сети много музыки или видео, то он накачает себе много-много одинаковых
файлов - копий ваших заготовок. Закачка будет происходить локально с вашего сервера, а
значит и внешнего трафика никакого не будет.
Для того, чтобы пользователи локальной сети ходили в Интернет только через squid и не
имели возможности выйти в мир напрямую (отключив в своих браузерах proxy-сервер),
можно реализовать перехват соединения по 80 порту и заворот этого соединения на наш
squid на порт 3128:
# vi /usr/local/etc/squid/squid.conf
24
httpd accel uses host header on # ipfw add 200 fwd 127.0.0.1,3128
И это, как ни странно, всё. Осталось запустить httpd и ваш сервер будет отвечать на
запросы по 80 порту:
# /usr/local/etc/rc.d/apache start
Предполагая, что у вас будет жить не один сайт, настроим сразу виртуальные хосты с
некоторыми полезными опциями (например прямой доступ к файлам в директории):
# vi /usr/local/etc/apache/httpd.conf
Include etc/apache/virtual.conf
# vi /usr/local/etc/apache/virtual.conf
NameVirtualHost 222.111.33.100:80
<VirtualHost 222.Ill.33.100:80>
ServerAdmin admin@mail.ua
DocumentRoot /home/admin/www
ServerName mail.ua
ServerAlias www.mail.ua
CustomLog etc/apache/logs/mail.ua-access log common
ErrorLog etc/apache/logs/mail.ua-error log
</VirtualHost> <Directory "/nome/admin/www/fotos/">
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
Здесь писать много не будем. Отметим только, что установив некоторые программы и
библиотеки из портов, и ничего не настраивая, вы будете иметь эту самую связку:
#74 cd /usr/ports/databases/mysql51-server/
#75 make && make install
#76 cd /usr/ports/lang/php4/
#77 make && make install
#78 cd /usr/ports/databases/phpmyadmin/
#79 make && make install
25
4.09. Web-интерфейс для доступа пользователей к почте
Теперь, когда у нас есть свой web-сервер, мы можем сделать полезную вещь для наших
пользователей - настроить доступ к их почтовым ящикам по web-интерфейсу:
#80 cd /usr/ports/mail/openwebmail
#81 make && make install
Теперь представьте себе, что у вас есть второй удалённый офис. Он так же подсоединён к
сети Интернет и вы хотите соединить две локальные сети офисов в единую виртуальную
локальную сеть и иметь доступ с любого компьютера одного офиса на любой компьютер и
принтер другого. Построим такую сеть (VPN) средствами IPSec. Необходимые опции в ядро
мы уже включили выше. Пусть второй офис имеет параметры: локальную сеть
192.168.1.0/24 и подключение к Интернет с адресом 111.111.11.1. Для организации VPN нам
необходим будет FreeBSD сервер, аналогичный нашему. Теперь добавляем у нас:
# vi /etc/rc.conf
gif interfaces="gif0"
gifconfig_gif0="22 2.111.33.100 111.111.11.1"
ifconfig_gif0="inet 10.0.0.1 192.168.1.1 netmask 255.255.255.0"
# vi /etc/rc.local
route add 192.168.1.0/24 192.168.1.1
# vi /usr/local/etc/firewall.conf
add 20000 allow ip from me to 111.111.11.1
add 20010 allow ip from 111.111.11.1 to me
add 20020 allow ip from 10.0.0.0/24 to 192.168.1.0/24
add 20030 allow ip from 192.168.1.0/24 to 10.0.0.0/24
Можно построить VPN не на уровне ядра системы, а при помощи утилиты openvpn. Минус
в том, что в этом случае наша сеть будет менее стабильна и устойчива. Плюс в том, что
27
таким образом можно настраивать не только связку FreeBSD - FreeBSD, а и, например,
FreeBSD - Windows 2000 / 2003. Подробно описывать настройку openvpn мы здесь не
будем. Кому интересно - в Интернете масса статей по этому поводу.
Рано или поздно у вас появится не один, а несколько FreeBSD серверов и вы захотите
копировать между ними файлы в автоматическом режиме (например, логи squid или
графики загрузки канала). Для этого есть прекрасная команда scp (secure copy), однако,
она требует ввода пароля. Для беспрепятственного же копирования файлов между
серверами UNIX (чтобы можно было использовать эту функцию в скриптах) нужно
сформировать ключ по алгоритму DSA. Генерировать его надо на том сервере, с которого
планируется копировать файлы:
# ssh-keygen -t dsa
Если всё равно вы видите запрос пароля, проверьте конфигурационный файл демона sshd
на удалённой машине:
# vi /etc/ssh/sshd_config
PubkeyAuthentication yes AuthorizedKeysFile
.ssh/authorized keys
Весьма небесполезная программа mrtg построит вам любые графики любых параметров,
которые можно измерять с течением времени. Мы же будем использовать её в связке с
snmp для построения графиков загрузки нашего Интернет-канала:
#89 cd /usr/ports/net-mgmt/net-snmp/
#90 make && make install
#91 cd /usr/ports/net-mgmt/mrtg/
#92 make && make install
#93 vi /usr/local/share/snmp/snmpd.conf
rwuser root noauth
rouser root noauth
rwcommunity public 222.111.33.100
rocommunity public 222.111.33.100
# vi /usr/local/etc/mrtg/mrtg.cfg
WorkDir: /usr/local/etc/mrtg/www
Target[elbrus]: 1:public@222.Ill.33.100
MaxBytes[elbrus]: 256000
Title[elbrus]: Traffic Analysis for Elbrus
PageTop[elbrus]: <Hl>Stats for Elbrus server</Hl>
# vi /etc/rc.conf
snmpd enable="YES"
28
# vi /etc/crontab
*/5 * * * * root /usr/local/bin/mrtg /usr/local/etc/mrtg/mrtg.cfg
# killall -HUP cron
Здесь отметим, что такое /etc/crontab и демон cron. Это своего рода планировщик
заданий. Чуть выше мы задали выполнение команды mrtg каждые 5 минут (назначение
первых пяти записей в строке (*/5 * * * *) описано в самом файле /etc/crontab).
Теперь нужно добавлять правила ipfw для того, чтобы ipa снимала с них информацию о
проходящем объёме трафика. Такие два правила у нас уже есть - они считают общий
объём входящего и исходящего внешнего трафика нашего сервера. После этого нужно
создать ipa.conf и ipastat.conf:
10010 count ip from any to 222.111.33.100 in recv edO
10020 count ip from 222.111.33.100 to any out xmit edO
# vi /usr/local/etc/ipa.conf
ac mod "ipa ipfw.so"; db
mod "ipa db sdb.so";
global {
update time = 30s;
append time = In;
ac list = ipfw;
db list = sdb;
sdb:db group = wheel;
}
rule 10010 {
ipfw:rules = 10010;
ipfw:maxchunk = IOC-
info = "IP incoming";
}
rule 10020 {
ipfw:rules = 10020;
ipfw:maxchunk = IOC-
info = "IP outgoing";
}
# vi /usr/local/etc/ipastat.conf
st mod "ipa st sdb.so";
dynamic rules = yes;
global {
st list = sdb; }
29
* Total 1024 (1 day)
30
Символ ~ в командной строке заменяет путь к домашнему каталогу пользователя, т.е.
предыдущая команда эквивалентна следующей записи: # vi /home/admin/scripts/ipa
check network.sh
Однако в скриптах нужно всегда писать полный путь к используемым файлам, т.к. они
могут быть запущены от имени разных пользователей.
Теперь напишем скрипт для проверки объёма скачанного трафика в текущем месяце и
сравнения его с назначенной пользователю квотой:
# vi ~/scripts/ipa_check_quotas.sh
#!/bin/sh
net="10.0.0"
ipfw show 17000-17255 > /home/admin/scripts/ipfw quota.txt
I
while
cut -flread
-d" str
do -f2 -d"
cut
echo
cut -f3 -d"$str
echo $str
echo $str
expr 17000 + $i"
expr 12000 + $i"
date | cut -f2 -d' '"
="/usr/local/bin/ipastat ="expr $sl" ="expr
$sl / 1024" ="expr $sl / 1024" = "less
/home/admin/scripts/ipfw quota.txt | cut
[ "$s2" ]
exec < $1
-fl-i $m -r $n | grep Total | cut -f4
-q
| grep $1
i=
q=
e=
1=
n=
m=
si
si
si
si
s2
if [
then
s2="expr $s2"
if [ $s2 -ne $1 ]
then
s2=""
fi fi
if [ $sl -ge $q ]
then
if [ -z "$s2" ]
then
| mail $e
ipfw add $1 deny tcp from $net.$i to me 3128 echo "Your HTTP-
access was blocked. Your quota is $q Mb. fi else
if [ "$s2" ]
then
ipfw delete $1
| mail $e
echo "Your HTTP-access was opened. Your quota is $q Mb.' fi fi done
exit 0 # vi ~/scripts/quotas.conf 7:1000:admin@mail.ua
15:200:jurist@mail.ua
Несложно понять, что в случае превышения квоты, система ipfw просто запретит
пользователю доступ к серверу по порту 3128, т.е. у человека пропадёт доступ к Интернету
31
о чём он получит уведомление по почте. В следующем же месяце доступ автоматически
откроется. Запуск скрипта будет иметь следующий вид:
# ~/scripts/ipa_check_quotas.sh ~/scripts/quotas.conf
32
# vi /etc/crontab
*/20 * * * * root /home/admin/scripts/ipa check network.sh
*/10 * * * * root /home/admin/scripts/ipa check pipe.sh 300
В идеале, нужно скомбинировать эти два метода так, чтобы для всех квота была
константой, но можно было бы ещё вести персональные квоты (в отдельном файле).
В некотором роде полезную, а в основном конечно же просто для «прикола», вещь так же
можно написать при помощи скриптов shell. Это отправка команд вашему серверу при
помощи обычных sms с вашего мобильного телефона. Для начала нужно создать почтовый
адрес (например sms@mail.ua) специально для приёма команд (ведь sms сообщение будет
попадать на ваш сервер, как обычное письмо) и прописать алиас, чтобы письмо
сохранялось, как текстовый файл в системе, который, собственно и будет обрабатывать
наш скрипт:
# vi /etc/mail/aliases
sms: admin, /sms/sms.txt
#102 newaliases
#103 mkdir /sms
#104 chown mailnull:mailnull /sms
#105 chmod 0700 /sms
#106 vi /etc/crontab
***** root /sms/sms.sh
# vi /sms/sms.sh
#!/bin/sh
adr="grep "From 380777777777" /sms/sms.txt"
operl="grep "CMD:" /sms/sms.txt"
oper2="grep "RBT:" /sms/sms.txt"
echo " " > /sm/sms.txt
if [ "$adr" ]
then
if [ "$operl" ]
then
cmd="echo "$operl" | cut -d: -f2"
ans="$cmd"
echo "$ans" | mail 380777777777@sms.mobileoperator.com fi
if [ "$oper2" ]
then
time="echo "$oper2" | cut -d: -f2"
shutdown -r $time fi fi exit 0
Надеемся, что принцип действия скрипта вам понятен. Вы должны отправить со своего
телефона сообщение на почтовый адрес sms@mail.ua. Скрипт запускается каждую минуту
и проверяет, было ли получено новое письмо. Если да, то проверяет с вашего ли телефона
и верен ли формат команд. Если всё ОК - выполняется команда и отправляется ответ.
Ничего сложного. Формат сообщения должен иметь следующий вид:
sms@mail.ua CMD:ipfw add 50 deny ip from any to 10.0.0.3
или:
sms@mail.ua RBT:now Вы можете добавлять свои дополнительные условия
(например ещё пароль) и вообще модифицировать работу скрипта как хотите. Главное -
идея. :)
33
Не забывайте перезапускать процесс после того, как отредактируете его конфигурацион-
ный файл. В данном случае речь идёт о демоне сгоп. Только после его перезапуска он
начнёт обрабатывать строку, которую мы в него добавили.
Теперь, когда ваш сервер полностью настроен и готов к тому, чтобы вы про него
благополучно забыли, самое время сделать себе лично приветствие при входе на сервер: #
vi /etc/motd
ELBRUS WellCome to
Korney's FreeBSD Server!!!
Ну, теперь можно наслаждаться даже входом в систему - ваш сервер полностью готов!
И напоследок маленький совет. Так как мы имеем дело всё-таки с техникой, делайте
резервные копии ваших конфигурационных файлов. В случае чего, вы сможете поднять
ваш сервер заново за 1 час, а это лучше, чем 1 день. Так что, если придумывать лень, вот
вам элементарный скрипт. Пусть он вам не пригодится никогда, но если вдруг что - потом
спасибо скажете: # vi ~/backup.sh #!/bin/sh
cd /home/admin/backup/
mkdir /home/admin/backup/temp
cp -r /etc ./temp/
cp -r /usr/local/etc ./temp/usr.local.etc
rm -r ./temp/usr.local.etc/squid/errors
cp -r /usr/src/sys/i386/conf ./temp/kernel
cp -r /home/admin/scripts ./temp/
exit 0
34
5. Инструменты на каждый день
5.01. Работа с файлами в shell
В этом коротком разделе мы опишем далеко не все, но очень нужные команды в shell,
которыми вы будете пользоваться каждый день. Так же опишем далеко не все, но очень
нужные ключи к этим командам. Если вы работали в MS-DOS, то некоторые вещи будут вам
знакомы. В ином случае вам потребуются некоторые вспомогательные сведения. Как и
большинство современных операционных систем, FreeBSD сохраняет файлы в
иерархической древовидной структуре. Такой же тип файловой системы используется в
системах Windows и Macintosh. Единственная разница заключается в том, что в Windows и
Macintosh используется графическое представление папок и файлов в графическом
диспетчере файлов, а в консоли FreeBSD - текстовое. В Windows или DOS при регистрации
пользователь, как правило, попадает в корневой каталог. Во FreeBSD дело обстоит иначе.
После регистрации пользователь попадает в свой начальный каталог, который расположен
на несколько уровней ниже корневого каталога. Теперь по командам:
35
Помните, что большинство команд UNIX выполняют указанные действия над файлами и
каталогами, не задавая лишних вопросов, даже в тех случаях, когда они могут уничтожить
существующие файлы. UNIX не ведет пользователей за руку, как Windows. В UNIX по
умолчанию предполагается, что пользователь знает, что он делает, когда просит систему
выполнить что-либо. Поэтому в тех случаях, когда вы не уверены в своих действиях,
используйте опцию -i. Тогда большинство команд будет запрашивать подтверждения, если
возникнет угроза повреждения существующих файлов.
Теперь несколько слов об именах файлов. Хотя технически UNIX позволяет включить в имя
файла любой символ (некоторые символы нельзя просто ввести, их следует указывать как
двусимвольные последовательности, начинающиеся с косой черты), желательно все-таки
ограничиться только буквами, цифрами, точкой, дефисом и символом подчеркивания.
Нежелательно начинать имя с дефиса, поскольку в UNIX дефис, как правило,
интерпретируется как символ, за которым следует опция (ключ). В имя можно включать и
пробелы. Однако в этом случае его необходимо заключить в кавычки, чтобы интерпретатор
мог воспринять имя целиком, а не как список нескольких файлов. Я рекомендую
воспользоваться распространенной практикой: заменять пробелы на символы
подчеркивания. Тогда имена легко читаются и не требуют кавычек при работе с ними.
Избегайте применения в именах файлов специальных символов. В противном случае,
пользуйтесь специальным escape-символом - это символ обратной косой черты «\». Он
указывает, что следующий за ним символ следует рассматривать в его первичном (а не в
специальном)значении.
Отличаются они тем, что команда locate использует свою собственную индексную базу
файловой системы, следовательно поиск происходит намного быстрее, однако индексная
база обновляется с некоторой периодичностью, следовательно, нельзя рассчитывать на то,
что команда locate покажет только что созданный (скопированный/перемещённый) файл.
Индексную базу locate можно обновить вручную:
# /etc/periodic/weekly/310.locate
Далее рассмотрим команды для работы с текстовыми файлами. UNIX и FreeBSD включают
множество команд обработки текстовых данных в интерпретаторе. Здесь мы рассмотрим
наиболее полезные из них:
36
less [файл] - просмотр текстовых файлов.
cut [опции] [файл] - вывод частей строк из файлов. Опции обычно имеют вид:
-f[номер поля] -d'[символ-разделитель]'
Далее следует разобраться с моделью владения файлами. Все варианты UNIX имеют
одинаковую структуру: каждый файл или каталог принадлежит и пользователю, и группе.
Тем не менее это не означает, что все пользователи или члены группы имеют одинаковые
права доступа. Режим доступа к файлу задаётся строкой вида:
37
-rwxr-xr-x
Теперь рассмотрим строки, задающие права доступа к каталогам. Прежде всего, каталоги
распознаются по первому биту в строке - d. Это просто флажок, не связанный с правами
доступа. Полномочия на работу в каталоге действуют по тому же принципу, что и
полномочия на файлы, но здесь есть отличия:
г - каталог можно читать (выполнить команду Is);
w - каталог и файлы внутри него можно модифицировать, удалять и переименовывать;
х - в каталоге можно производить поиск файлов.
Так, например, запись drwxr-xr-x означает, что данный объект является каталогом (d), его
владелец может выполнять в этом каталоге любые действия, а его группа и остальные
могут только читать и выполнять поиск.
Во-первых, он имеется в любой операционной системе UNIX, с которой вам быть может,
придется работать. Как знать, он может оказаться и единственным редактором в
операционной системе...
Сразу после запуска редактор vi будет находиться в командном режиме. В этом режиме
нажатия клавиш интерпретируются как команды редактору, а не как текст, вводимый в
документ. Чтобы переключиться в режим ввода текста, необходимо нажать одну из клавиш:
а - append (присоединить). В этом режиме вводимый текст вставляется после символа, на
котором находится курсор.
i - insert (вставить). В этом режиме вводимый текст вставляется перед символом, на
котором находится курсор.
0 - open (открыть). Это приводит к тому, что после строки, на которой находится курсор, в
текст вставляется новая строка. Затем курсор перемещается на новую строку и редактор vi
переходит в режим insert, разрешая ввод текста на новой строке.
Перемещаться по тексту в режиме ввода текста можно, как правило, с помощью курсорных
клавиш или клавиш Page Up / Page Down. Однако имеются и другие клавиши, позволяющие
перемещаться по документу в командном режиме: h - перемещает курсор влево на один
символ; j - перемещает курсор вниз на один символ; к - перемещает курсор вверх на один
символ;
1 - перемещает курсор вправо на один символ;
w - перемещает курсор вперед на одно слово;
ь - перемещает курсор назад на одно слово;
е - перемещает курсор в конец следующего слова;
39
0 - перемещает курсор в начало строки;
$ - перемещает курсор в конец строки;
) - перемещает курсор в начало следующего предложения;
( - перемещает курсор в начало предыдущего предложения;
} - перемещает курсор в начало следующего абзаца;
{ - перемещает курсор в начало предыдущего абзаца;
G - перемещает курсор в конец текущего документа;
Л
- перемещает курсор к первому символу строки, не являющемуся пробелом;
н - перемещает курсор на первую строку на экране;
1 - перемещает курсор на последнюю строку на экране.
В редакторе vi имеется так же ряд команд для выполнения поиска и замены текста: /текст -
поиск в прямом направлении до первого совпадения с заданным текстом; / - повтор поиска
текста в прямом направлении до обнаружения очередного совпадения; ?текст - поиск в
обратном направлении до первого совпадения с заданным текстом; ? - повтор поиска
текста в обратом направлении до обнаружения очередного совпадения; % - перемещение
курсора на соответствующую парную скобку (для программистов); : з/текст1 /текст2 - замена
в текущей строке каждого совпадения текста1 на текст2; : %з/текст1 /текст2 - замена в
файле каждого совпадения текста1 на текст2;
И последнее, что нам осталось, - это операции над файлами и выход из редактора:
: wq - сохраняет изменения в текущем файле и осуществляет выход из редактора;
: w - сохраняет изменения в текущем файле;
: w! - сохраняет изменения в текущем файле в любом случае;
: q - осуществляет выход из редактора;
:q! - осуществляет выход из редактора в любом случае;
:е - файл загружает заданный файл в редактор для редактирования;
: е! - отбрасывает все изменения и перезагружает с диска старый вариант файла.
40
Вот в принципе и всё, что вам необходимо знать для эффективной работы с текстовыми
файлами в редакторе vi.
Переменные.
В именах переменных учитывается регистр. Они могут содержать буквы, цифры и символ
подчеркивания. Имя переменной не может начинаться с цифры. Кроме того, не следует
вначале имени переменной использовать подчерк. Желательно применять описательные
имена, чтобы код программы было легко читать. В простейшем случае значение
переменной присваивается следующим образом: myvar=5
Теперь MYVAR является переменной среды, которая будет доступна другим программам,
запущенным из данного командного интерпретатора.
42
The name of the program is: ./yourname.sh The
total number of arguments received is: 2 The
complete argument string is: Ivan Petrov Your
first name is: Ivan Your last name is: Petrov
#
Подстановка команд.
Подстановка команд позволяет запустить команду и присвоить ее вывод переменной.
Выполняемую команду следует заключить в символы \ Их не следует путать с одинарными
кавычками. Символ " представляет собой символ обратной кавычки (на клавиатуре он, как
правило, совмещен с символом тильды ~). Например, оператор:
TodayDate="date" запускает команду date и присваивает ее вывод переменной
TodayDate. После этого к значению переменной можно обращаться обычным образом.
Циклы.
В некоторых случаях требуется повторять действие до тех пор, пока соблюдаются
определённые условия. В таких случаях стоит воспользоваться циклами. Командный
интерпретатор поддерживает три вида циклических конструкций: while, until и for.
43
Цикл while выполняет операторы, заключенные в нем, до тех пор, пока условие цикла
является истинным:
i=l
while [ $i -le 10 ]
do
echo $i i="expr $i
+ 1"
done Команда while содержит условие, заключенное в квадратные скобки. На самом
деле, они представляют собой сокращенную запись команды под названием test.
Последняя часто используется в сценариях командного интерпретатора. Команда
test использует достаточно прозрачный синтаксис, близкий к Фортрану: -eq - истина, если
операнды равны; -пе - истина, если операнды не равны; -gt - истина, если первый операнд
больше второго; -де - истина, если первый операнд больше или равен второму; -it - истина,
если первый операнд меньше второго; -le - истина, если первый операнд меньше или равен
второму.
Циклы while и until позволяют работать с логическими операторами AND и OR. Логическое
выражение AND возвращает значение истина лишь в том случае, когда оба операнда
истинны, а выражение OR - когда лишь один из операндов имеет значение истина:
while [ $varl -gt 10 ] && [ $varl -it 20 ] - истина, если 10 < varl < 20;
while [ $vari -it 10 ] || [ $vari -gt 20 ] - истина, если varl < 10 или varl > 20.
Цикл for отличается от while и until. Вместо проверки истинности условия цикл for
выполняет операторы внутри тела цикла в зависимости от количества аргументов в списке.
Цикл for содержит переменную, которая при каждой итерации получает следующий
аргумент из списка. Цикл for продолжается до тех пор, пока список не будет исчерпан:
for num in "jot 10 10 2 0 " do
sq root="echo "scale=3; sqrt($num)" | be -1
echo $sq root done
Условные операторы.
44
Очень часто программу нужно построить так, чтобы определённые участки кода
выполнялись только при определённых условиях. Существует две общих формы условных
операторов: if и case. Кроме того, есть ещё логические операторы AND/OR.
#!/bin/sh
if [ $# -ge 1 ]
then
echo "You supplied $# arguments."
else
echo "Usage: $0 filel file2..." fi
exit 0
Часть then оператора if является обязательной, а часть else - нет. Операторы в блоке then
выполняются тогда, когда условие истинно. Но иногда возникает необходимость выполнить
действия лишь тогда, когда выражение ложно. В этом случае нужно воспользоваться
двоеточием:
if [$# -ge l ]
then
else
echo "Usage: $0 filel file2..." fi
45
esac exit 0
Логические операторы AND/OR (&& и ||) в некоторых случаях заменяют операторы if. Код
завершения первой команды используется как условие запуска второй. Мы часто
пользуемся ими в командной строке. Например:
# tar czvf backup.tar.gz ./scripts && rm -r ./scripts
Если первая операция прошла успешно, то выполняется вторая. Если нет, то вторая
команда не выполняется. Другими словами: "Необходимо выполнить команды А и В. Но
если команда А невыполнима, то не следует исполнять и В". Второй пример:
# tar czvf backup.tar.gz ./scripts || echo "Operation failed."
Если первая операция прошла успешно, то вторую выполнять не нужно. Если нет, то
выполнить вторую. Другими словами: "Если А невыполнимо, исполнить В. Но если А
завершилось успешно, В не выполнять".
Функции.
Теперь стоит отметить то, что иногда приходится повторять один и тот же набор команд в
скрипте. Здесь нам на помощь приходят функции. Они представляют собой группы
операторов, вызываемые одной командой. Их можно рассматривать как "минипрограммы
внутри программ". О важности и полезности функций говорить не будем, т.к. надеемся, что
это и так понятно. Прежде всего, если определенный набор операций требуется выполнить
в нескольких местах программы, достаточно воспользоваться лишь одной командой. Во-
вторых, если вы захотите изменить то, как исполняется операция, достаточно будет внести
изменения лишь в одном фрагменте кода: on exit() {
echo "Good b y e . "
mail korney@mail.ua < ./report.txt
rm ./report.txt }
on exit
Файловые дескрипторы.
Файловые дескрипторы представляют собой числовые идентификаторы, устанавливаемые
ядром при запуске каждого нового процесса. По умолчанию командный интерпретатор
открывает три файловых дескриптора:
F.D. О STDIN. Это стандартный входной поток. Обычно ввод поступает с клавиатуры,
однако его можно перенаправить из файла или какого-либо другого источника;
F.D. 1 STDOUT. Это стандартный выходной поток. Обычно вывод поступает на экран,
однако, как вы понимаете, его также можно перенаправить;
F.D. 2 STDERR. Это стандартный поток ошибок. Обычно выводится на экран, но и его
можно перенаправить.
Для открытия файлового дескриптора используется команда exec:
#!/bin/sh
exec > ./testfile.txt
echo "Line 1 of the file"
echo "Line 2 of the file"
echo "Line 3 of the file"
46
exit 0
Оператор exec во второй строке примера перенаправляет поток STDOUT в файл testfile.txt.
В результате, операторы echo выводят информацию в testfile.txt, а не на экран, хотя в
каждом из них поток не перенаправлен явно. Если в файл нужно вывести более одной
строки текста, эффективнее использовать файловый дескриптор, а не перенаправление
вывода в каждом операторе. Этот же подход применяется при работе с файловым
дескриптором STDIN и командой read:
#!/bin/sh
exec < ./testfile.txt
while read string do
echo $string
done
exit 0
Отладка сценариев.
И в завершение коснёмся отладки сценариев командного интерпретатора, которая рано
или поздно вам понадобится. Хотя интерпретатор не имеет полноценного отладчика, он
обеспечивает простейшие возможности для мониторинга всех выполняемых действий.
Трассировка включается посредством редактирования первой строки:
#! /bin/sh -xv
После этого, при запуске программы, вы будете видеть на экране последовательно все
действия, которые она выполняет.
47
5.05. Справочник по командам и конфигурационным файлам
6. Заключение
Итак, вы установили свой собственный Интернет-сервер на базе ОС FreeBSD 6.3, с
чем вас сердечно поздравляем. Вы так же познакомились вкратце с основными
инструментами, которые могут вам пригодиться во время работы с вашими серверами. Что
теперь? А теперь, что касается FreeBSD, вам открыта дорога в любом направлении:
1.55. Вот именно теперь самое время купить новую книгу более высокого уровня -
какую-нибудь «Энциклопедию системного администратора FreeBSD». Эффект от её
прочтения теперь будет гораздо выше - вы ведь уже поработали со своим сервером
и знаете, чего можно ожидать и требовать от FreeBSD и, наверняка уже
вынашиваете какие-то идеи - осталось только их реализовать.
1.56. Именно теперь вы сможете намного более эффективно искать нужную
информацию и нужные программы для FreeBSD в сети Интернет.
1.57. Именно теперь вы перестали бояться UNIX. Всем пользователям Windows
становится немного не по себе, глядя на то, как работает системный администратор
UNIX в командной строке. И теперь вы - один из нас. :)
50