Linux

Настройка двусторонней синхронизации файлов с помощью unison

Для решения задачи по синхронизации данных между двумя машинами, в ситуации
когда изменения могут появиться на каждом из компьютеров, прекрасно подходит
утилита unison (http://www.cis.upenn.edu/~bcpierce/unison/). При синхронизации
между удаленными машинами в качестве транспорта может использоваться ssh. При
обнаружении конфликтов, например, когда на обоих машинах отредактирован один и
тот же файл, unison пытается разрешить конфликт автоматически, а если это не
удается предоставляет пользователю интерфейс для принятия решения.

Устанавливаем unison.

Fedora/RHEL/CentOS:

   sudo yum install unison

Debian/Ubuntu:

   sudo apt-get install unison

FreeBSD:

   $ cd /usr/ports/net/unison/ && make install

Синхронизируем две локальные директории:

   unison /test1 /test2

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

Для синхронизации с удаленной директорией необходимо указать:

   unison /test1 ssh://testserver.test.ru//test1

Чтобы выполнить синхронизацию автоматически, без интерактивного взаимодействия
с пользователем необходимо использовать опцию «-batch». В случае конфликта,
выполнение будет прервано с выводом соответствующего уведомления.

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

Например, создаем файл ~/.unison/test.prf:

   # Определяем список директорий, которые будут синхронизированы
   root = /home/project
   root = /mnt/NFS/home/project
 
   # Указываем сохранять права доступа и владельца
   owner = true
   times = true
 
   # Определяем список поддиректорий, которые нужно синхронизировать, остальное игнорируем:
   path = cgi-bin
   path = htdocs
   path = conf
 
   # Определяем маски для файлов, которые не нужно синхронизировать
   ignore = Name .htaccess
   ignore = Name *~
   ignore = Name .*~
   ignore = Path conf/project.conf
   ignore = Path htdocs/rrd
   ignore = Path htdocs/mon
   ignore = Name *.o
   ignore = Name *.tmp
   ignore = Name *.log
   ignore = Name *.gz
   ignore = Name *.iso
   ignore = Name {,.}*{.old}
 
   # Копируем в резервные копии изменяемых файлов в отдельную  директорию
   backup = Name *
   backups = true
   backupdir = /home/project/backup
 
   # Определяем свою команду для отображения отличий между копиями файлов при конфликте
   #diff = diff -y -W 79 --suppress-common-lines
 
   # Сохраняем лог с результатами работы в отдельном файле
   log = true
   logfile = ./sync.log

При необходимости синхронизировать описанные в файле конфигурации директории, выполняем:

   unison test
By sysadmin on 01.10.2010 | FreeBSD, Linux
Метки: , , ,

Удаленная переустановка linux на примере Debian

Существует множество фичей упрощающих жизнь системному администратору. Различные системы удаленного управления позволяют установить ОС на девственно-чистый сервер и сегодня это совсем не проблема. Даже наличие второго винчестера превращает проблему переустановки операционки в банальность. Поэтому в этой статье рассмотрим самый суровый из случаев: пусть на сервере имеется только один полностью разбитый винчестер, а наша задача — удалённо переустановить ОС.

Удивлённо поднимем брови, умиляясь тому, как гибка наша любимая операционка, засучим рукава и приступим к делу.

В основе данного метода лежит идея о том, что мы можем использовать SWAP-раздел для установки временной операционной системы, а когда она встанет на ноги — заняться основной. Главное и единственное, что нам нужно — это своп размером не менее 420 Мб (именно столько занимает lenny со всем необходимым).

В статье используются следующие допущения:
— у вас стоит дебиан, и ставить вы планируете дебиан,
— используется grub установленный в MBR.

Краткий план наших работ будет выглядеть так:

1. превращаем swap-раздел в ext3;
2. устанавливаем на него чистую ОС;
3. перезагружаемся в нее;
4. делаем нужные изменения на основном разделе;
5. копируем чистую ОС из временного в основной раздел;
6. загружаемся с основного раздела, включаем swap.

Подготовка раздела.

Первое, что мы сделаем — убедимся, есть ли у нас этот своп-раздел вообще:

# free -m
...
Swap:          470          0        470

Как видим — есть, и размер (отображается в Мб) вполне удовлетворяет требованиям. Осталось выяснить, как у нас разбит диск:

# fdisk -l /dev/sda
...
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1         462     3710983+  83  Linux
/dev/sda2             463         522      481950    5  Extended
/dev/sda5             463         522      481918+  82  Linux swap / Solaris

Видно, что на sda1 — текущая ОС, на sda5 — своп. Запутаться сложно, но всякое бывает.

Отключаем своп:

# swapoff -a

Убедиться, что мы его выключили, можно выполнив всё тот же free:

# free
...
Swap:            0          0          0

Обновим нашу таблицу разделов:

# fdisk /dev/sda
Command (m for help): t
Partition number (1-5): 5
Hex code (type L to list codes): 83
Changed system type of partition 5 to 83 (Linux)
Command (m for help): w
The partition table has been altered!
 
WARNING: Re-reading the partition table failed with error 16: Устройство или ресурс занято.
The kernel still uses the old table.
The new table will be used at the next reboot.
Syncing disks.

Нам заботливо сообщили, что ядро не увидит изменений до перезагрузки, но нам это пока и не нужно. Теперь самое время подготовить файловую систему на нашем старом новом разделе. Например, ext3:

# mke2fs -j /dev/sda5
Writing inode tables: done
Creating journal (4096 blocks): done

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

# mkdir /mnt/temp
# mount /dev/sda5 /mnt/temp
# df -h
Файловая система      Разм  Исп  Дост  Исп% смонтирована на
/dev/sda1             3,5G  600M  2,8G  18% /
...
/dev/sda5             456M   11M  422M   3% /mnt/temp

Установка «временной» ОС.

Здесь нужно заметить, что временной она является только по своему местоположению. Чтобы дважды не прогонять все действия по сборке чистой системы в дальнейшем мы просто скопируем её на основной раздел.

Используем отличное средство для получения минимальной установки — debootstrap. Здесь и далее мы будем считать что проблем с интернетом на сервере нет (иначе какой же он после этого сервер ?), поэтому выкачиваем всё из репозитория.

# aptitude install debootstrap
...
Настраивается пакет debootstrap (1.0.10lenny1) ...

Данной утилите достаточно передать четыре параметра: желаемая архитектура, название релиза, директория установки и ссылка на полное зеркало. Архитектуру можно определить по выводу `uname -a`, дистрибутив выбираем на свой вкус, директория в данном случае та, куда мы смонтировали наш раздел, а ссылку на зеркало можно взять здесь: http://www.debian.org/mirror/list. Получается, что строка запуска выглядит примерно так:

# debootstrap --arch i386 lenny /mnt/temp http://ftp.ru.debian.org/debian/

После нажатия enter начнется процесс загрузки и установки пакетов, при достаточно среднем интернет-соединении (~10 Мбит) на это уходит порядка 5-10 минут — я даже не успел допить свой чай. В конце вы увидите сообщение о том, что система успешно установлена:

I: Base system installed successfully.

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

Сначала скопируем все важные настройки. Наверное, у каждого найдутся достаточно важные файлы, которые лежат не там где положено. У меня, к примеру, есть некий /etc/rc.routes со всеми нестандартными маршрутами. Главное не забыть ничего. Приводить тут какой-либо список, мне кажется, совершенно бессмысленно, но у меня это выглядит примерно так:

# cp /etc/{resolv.conf,hosts,rc.local} /mnt/temp/etc
# cp /etc/network/interfaces /mnt/temp/etc/network
# cp /etc/your-stuff /mnt/temp/etc

В fstab напишем самое необходимое — proc и наш корневой раздел:

# cat > /mnt/temp/etc/fstab << "#EOF"
> proc            /proc           proc    defaults              0       0
> /dev/sda5       /               ext3    errors=remount-ro     0       1
> #EOF

Теперь смонтируем dev-окружение, перейдем в чрут нашей временной системы и сразу примонтируем proc:

# mount --bind /dev /mnt/temp/dev
# chroot /mnt/temp /bin/bash
# mount -t proc proc /proc

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

# wget http://debian.soar.name/sources.list -O /etc/apt/sources.list
# aptitude update

Настроим часовой пояс:

# dpkg-reconfigure tzdata

Также нам понадобятся следующие пакеты:

# aptitude install locales
# dpkg-reconfigure locales
# aptitude install console-data
# aptitude install ssh
# aptitude install sudo

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

# adduser --ingroup users soar
# visudo

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

# aptitude install grub
# grub-install /dev/sda

После чего необходимо инициализировать МБР на загрузку с нашего нового раздела. Для этого всё там же, в чруте, войдем в консоль граба и напишем следующее:

# grub
grub> root (hd0,
 Possible partitions are:
   Partition num: 0,  Filesystem type is ext2fs, partition type 0x83
   Partition num: 4,  Filesystem type is ext2fs, partition type 0x83

Своеобразный автокомплит по табу подскажет нам, какие разделы есть в нашем распоряжении. Как видим всё на единицу меньше чем в названии в системе. Инициализируем загрузку с нашего sda5:

grub> root (hd0,4)
 Filesystem type is ext2fs, partition type 0x83
 
grub> setup (hd0)
...
Done.
 
grub> quit

Загрузчик установлен куда нужно. Теперь выберем и установим подходящее ядро:

# aptitude search linux-image
# aptitude install linux-image-2.6.26-2-686

В ходе установки нас спросят «Create a symbolic link to the current kernel image?», на что мы ответим утвердительно. Так же сообщат, что мы устанавливаем ядро, требующее от загрузчика поддержку initrd, и уточнят, не передумали ли мы.
Отвечаем «Нет» и установка заканчивается. Осталось обновить меню загрузчика:

# update-grub
Found kernel: /boot/vmlinuz-2.6.26-2-686
Updating /boot/grub/menu.lst ... done

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

# exit
# reboot

Если все было сделано правильно — машина перезагрузится в нашу временную систему. Мы можем зайти в ssh как пользователь, которого мы только что добавили.

Перенос системы на основной раздел.

Форматируем и монтируем наш старый раздел:

# mke2fs -j /dev/sda1
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
 
# mkdir /mnt/temp
# mount /dev/sda1 /mnt/temp

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

Остается скопировать нашу чистую ОС на основной раздел:

# cp -a -x / /mnt/temp/

Обновляем fstab. На этот раз причешем его по всем правилам:

# cat > /mnt/temp/etc/fstab << "#EOF"
> # /etc/fstab: static file system information.
> #
> #
 
> proc            /proc           proc    defaults           0      0
> /dev/sda1       /               ext3    defaults,errors=remount-ro 0 0
> #EOF

В очередной раз нужно обновить граб. На этот раз — для загрузки уже с нашего основного раздела:

# mount --bind /dev /mnt/temp/dev
# chroot /mnt/temp/ /bin/bash
# grub-install /dev/sda
# grub
 
grub> root (hd0,0)
 Filesystem type is ext2fs, partition type 0x83
 
grub> setup (hd0)
 Checking if "/boot/grub/stage1" exists... yes
 Checking if "/boot/grub/stage2" exists... yes
 Checking if "/boot/grub/e2fs_stage1_5" exists... yes
 Running "embed /boot/grub/e2fs_stage1_5 (hd0)"...  17 sectors are embedded.
succeeded
 Running "install /boot/grub/stage1 (hd0) (hd0)1+17 p (hd0,0)/boot/grub/stage2 /boot/grub/menu.lst"... succeeded
Done.
 
grub> quit
 
# update-grub
Updating /boot/grub/menu.lst ... done

Тут стоит отметить, что у меня в этом месте, в отличие от первого случая, menu.lst обновляться отказался, и там по-прежнему оставались ссылки на sda5. Почему это происходит — я так и не разобрался, поэтому вручную подредактировал этот файл:

# sed -i -e 's/sda5/sda1/g' /boot/grub/menu.lst
# sed -i -e 's/(hd0,4)/(hd0,0)/g' /boot/grub/menu.lst

Выходим из чрута и делаем вторую перезагрузку:

# exit
# reboot

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

# df -h
Файловая система      Разм  Исп  Дост  Исп% смонтирована на
/dev/sda1             3,5G  436M  2,9G  13% /

Остается создать и включить своп:

# fdisk /dev/sda
Command (m for help): t
Partition number (1-5): 5
Hex code (type L to list codes): 82
Changed system type of partition 5 to 82 (Linux swap / Solaris)
...
The new table will be used at the next reboot.
Syncing disks.
 
# cat >> /etc/fstab << "#EOF"
> /dev/sda5       none            swap    sw                   0      0
> #EOF
 
# mkswap /dev/sda5
# swapon -a

Убедимся что всё нормально:

# free -m
Swap:          470          0        470

Ну и в конце, если вы редактировали /boot/grub/menu.lst врукопашную — стоит все-таки запустить скрипт его обновления еще раз:

# update-grub
Updating /boot/grub/menu.lst ... done

Подводя итоги.

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

Источник

By sysadmin on 17.08.2010 | Linux
Метки: , ,

Cоветы по использованию утилиты GNU Find

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

Имейте ввиду, что не все версии find одинаковы, и та, которую вы используете в Linux, будет отличаться от версий для Mac, BSD или Solaris. В основном синтаксис одинаков во всех версиях, но местами встречаются небольшие различия.

Простой поиск

Давайте начнём с простого. Если вам известно имя файла, но вы не знаете точно в каком каталоге он расположен, синтаксис find будет предельно прост. Просто сообщите find имя искомого файла:

find -name имя_файла

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

jzb@kodos:~$ find -name filename
./projects/filename
jzb@kodos:~$

Поиск по размеру

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

Для такого случая у find имеется опция -size, принимающая в качестве параметра размер, являющийся критерием поиска. Размер можно указывать начиная с байтов (b), заканчивая гигабайтами (G). Например, чтобы выполнить поиск файлов размером 100 килобайт, можно использовать команду:

find -size 100k

Однако такой вариант может не подойти в нашем случае. Более подходящим будет поискать файлы размеров больше (или меньше) заданного. Чтобы выполнить такой поиск, просто добавьте «+» или «-» к размеру, и find будет искать файлы большего или меньшего размера соответственно, чем указан. Например, следующая команда найдёт все файлы размеров более 100 килобайт:

find -size +100k

а эта — менее, чем 100 килобайт:

find -size -100k

Также, вы можете попросить find найти все пустые файлы:

find -empty -type f

Обратите внимание на указанную опцию -type с параметром «f», которая указывает find искать только обычные файлы. Если не указать это, то find выведет также и пустые каталоги.

Поиск по владельцу

Другой, часто используемый, вариант поиска — поиск по принадлежности файла какому-то пользователю или даже по его отсутствию. Например, вы переместили какие-то файлы в другую систему или же удалили какого-то пользователя, вероятно сделав файлы «сиротами». Отыскать такие файлы-сироты можно простой командой:

find -nouser

Для поиска файлов, принадлежащих какому-то конкретному пользователю, существуют опции -user и -uid. Первая опция принимает как имя пользователя, так и его идентификатор, а вторая — только идентификатор. Например, если мне нужно будет найти все файлы, владельцем которых я являюсь, я воспользуюсь одной из команд:

find -user jzb
find -user 1000
find -uid 1000

Также, вам может понадобиться найти файлы принадлежащие пользователю А или пользователю Б. Для этого необходимо объединить два условия поиска при помощи оператора «-o»:

find -user root -o -user www-data

Такая команда будет искать файлы, владельцем которых является пользователь root или же пользователь www-data. Если же, например, вы хотите найти файлы, владельцем которых пользователь не является, используйте оператор «-not»:

find -not -user www-data

Естественно, операторы работают и с другими опциями. К примеру, следующая команда найдёт файлы, владельцем которых является www-data и которые размером не более ста килобайт:

find -user www-data -not -size +100k

Поиск по группе-владельцу

Ещё один способ использования find — поиск файлов, принадлежащих какой-то группе пользователей. Для этого используется опция «-group», параметром которой должно быть имя группы или её идентификатор. Например:

find -group admin

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

Поиск по правам доступа

Иногда у вас может возникать необходимость найти файлы, доступные для записи кому угодно или файлы, имеющие какие-либо другие «плохие» разрешения. Подобный поиск find может осуществлять при помощи различных опций. Простейшие из них — это операторы -readable, -writable и -executable, которые работают применительно к пользователю, запустившему find. Имейте ввиду, что в слишком древних версиях find эти опции отсутствуют.

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

find -type f -perm -110

Здесь параметр «110» сообщает find набор битов доступа, а «-» заставляет игнорировать все остальные. Таким образом, если файл имеет ко всему прочему установленные биты чтения и записи, он также будет соответствовать критерию поиска, поскольку для find важно лишь то, что установлены указанные биты выполнения.

Если вам необходимо точное совпадение с указанным режимом доступа, то уберите опцию «-».

А что, если вам необходимо найти файлы, исполняемые владельцем или группой? В это случае вместо «-» используйте «/»:

find -type f -perm /110

Поиск по правам доступа часто пригождается, хотя и не лишён некоторой сложности, и вам может потребоваться какое-то время, прежде, чем вы привыкните к его синтаксису. Особенно это касается новичков, которые ещё толком не разобрались с механизмом битов доступа файлов. В этом случае чтение man-страницы find особенно рекомендуется.

Использование регулярных выражений

Иногда вам может потребоваться использование регулярных выражений, чтобы определить критерии поиска. И find поддерживает их даже в большей степени, чем вы, возможно, ожидали. find не только поддерживает использование регулярных выражений, но и позволяет использовать различные их типы. Тип регулярного выражения можно определить при помощи опции -regextype, которая принимает параметры posix-awk, posix-egrep и тому подобные. В man-странице вы найдёте полный перечень поддерживаемых типов регулярных выражений вашей версией find.

Небольшой пример. Скажем, вам нужно найти файлы, имеющие расширения «.php» и «.js». Такое можно осуществить следующей командой:

find -regextype posix-egrep -regex '.*(php|js)$'

Выглядит страшновато, не так ли? Эта команда говорит find использовать синтаксис регулярных выражений egrep (-regextype posix-egrep), а затем сообщает само регулярное выражение. Выражение обрамлено одинарными кавычками, чтобы оболочка не пыталась по-своему интерпретировать спецсимволы, использующиеся в выражении. В самом выражении «.*» означает любой символ, повторяющийся ноль или более раз. Часть выражения «(php|js)» сообщает о необходимости искать «php» или «js» (символ вертикальной черты используется для определения оператора «или»). И, наконец, знак доллара в конце выражения сообщает о том, что предыдущая часть выражения должна искаться в конце строки.

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

Работа со временем

Что, если вам понадобится найти файлы, основываясь на их возрасте? Иногда бывает, что знаешь, в каком промежутке времени файл был создан, а всё остальное — позабылось. Или же, вам может понадобиться отыскать какие-то старые файлы, которые пора удалить. В общем, причин может быть куча.

find в полном объёме умеет работать со временем, позволяя искать по времени последнего доступа к файлу (-atime), времени последнего изменения файла (-mtime), или по времени его создания (-сtime).

Например, давайте все найдём файлы, которые были изменены за последние два дня:

find -mtime +2

Параметры опций, работающих со временем, можно интерпретировать как «N раз по 24 часа» и в действительности означают промежуток времени. Если вы передадите find опцию «+1», то она поймёт это как «не менее, чем 24 часа назад, но не более, чем 48».

Эти опции вы также можете комбинировать, если нужно отыскать файлы, временные критерии поиска находятся в каком-то промежутке. Так, команда

find -mtime +2 -mtime -5

означает «два или более дня назад, но не более пяти дней назад».

Работа с минутами

Иногда бывает нужно найти файлы, изменённые за последние 24 часа, и в этом случае рассмотренные опции *time по понятным причинам не подойдут. Однако, на этот случай, у find припасены специальные опции -amin, -cmin, -mmin, которые работают подобно выше рассмотренным, с той разницей, что в качестве параметров они принимают минуты, а не сутки. Так что, если вам нужно найти какие-то файлы, изменённые, например, в течение рабочего дня — это те самые опции, которые вам помогут.

Ограничение поиска

Иногда find выдаёт намного больше результатов поиска, чем вам нужно. При помощи опции -maxdepth вы можете ограничить find таким образом, чтобы она не «зарывалась» слишком глубоко. Например, если вы хотите найти все файлы c расширением «js» в каталоге wordpress, можно воспользоваться командой:

find wordpress -name '*js'

Но что, если вас интересуют файлы лишь из каталога верхнего уровня? Нет проблем: ограничьте описк при помощи опции -maxdepth:

find wordpress -maxdepth 1 -name '*js'

Такая команда заставит искать find только в каталоге wordpress, не заходя в подкаталоги, которые в нём содержатся. Если вы хотите поискать в этих подкаталогах, но не соваться глубже — увеличьте параметр опции -maxdepth на единицу и т. д.
Действия над найденными файлами

Итак, вы нашли то, что искали. Что вы будете делать с найденным? Используя xargs или опцию find -exec, можно выполнять необходимые действия с найденными файлами.

Давайте представим, что вы хотите сменить владельца каких-то файлов с root на www-data. Для начала нужно все эти файлы найти, а затем уж сменять их владельца. Смена владельца вручную по списку, полученному от find звучит как-то скучно. Всё же, лучшим решением будет использовать опцию -exec:

find -user root -exec chown www-data {} \;

Такая команда заставляет find передавать пути всех найденных файлов утилите chown, которая и будет изменять владельца файлов. Легко и просто!

Заключение

Знание возможностей утилиты find является обязательным для всех пользователей Linux, которые хотят освоить свою систему. Когда используется рабочий стол, вы можете обойтись без утилиты find, но при администрировании системы вам нужно иметь свои приемы применения утилиты find. Если вы собираетесь использовать параметры -exec и xargs для внесения изменений в файлы или удаления файлов, сначала сделайте один или пару тестов с тем, чтобы убедиться, что команда работает так, как ожидается.

By sysadmin on 15.08.2010 | FreeBSD, Linux
Метки: , , , ,

Советы по работе с DNS зонами

Чтобы было наглядней о чем разговор идет, опишу как происходит процесс делегирования. Делегирование — это то каким образом пространство имен в DNS делится на зоны. Зона — это обособленная ветвь пространства DNS имен которая располагается на своих авторитарных DNS серверах. В зону может входить любое количество доменов нижележащего уровня — до тех пор пока они все расположены на одних и тех же авторитарных серверах, зона у них одна и та же.
Делегирование из родительской зоны происходит путем создания NS записей. В дочерней (делегированной) зоне создается полное описание зоны начиная с SOA записи. Вот, например, когда регистрируется домен второго уровня через регистратора nic.ru, то там при регистрации просят указать имена и адреса минимум двух DNS серверов которые будут считаться авторитарными для данной ветви пространства DNS имен. Для проведения делегирования не обязательно иметь под зону именно два DNS сервера — просто у nic.ru такая политика для того чтобы заставить клиентов обеспечить надежность системы. Вот эти два сервера становятся NS записями в домене ru.

Пример. Скажем, нами регистрируется домен второго уровня под названием net.ru. Авторитарными для него будут DNS сервера ns.net.ru (IP 1.2.3.4) и ns2.dnshosting.com (IP 5.6.7.9). В записях DNS серверов отвечающих за зону ru. (которыми управляет организация nic.ru) вносится такая информация:

$TTL 300
ru.   IN   SOA   ns.ripn.net. hostmaster.ripn.net. (
         4014396 ;serial
         7200   ;refresh
         900   ;retry
         2592000   ;expire
         3600   ;neg. ttl
         )
      NS   sunic.sunet.se.
      NS   e.dns.ripn.net.
      NS   ns.ripn.net.
      NS   ns5.msk-ix.net.
 
; это добавили
net.ru.   NS   ns.net.ru.
net.ru.   NS   ns2.dnshosting.com.
ns.net.ru.   A   1.2.3.4

Запись «ns.net.ru. A 1.2.3.4» называют еще «glue record», она нужна в случаях, когда имя NS сервера располагается внутри делегированной зоны. Это вспомогательная запись которую обязательно указывать в таких случаях. Без нее возникла бы ситуация, когда для того чтобы узнать IP сервера ns.net.ru надо обратиться к нему по IP (замкнутый круг). Так как второй NS расположен в чужой зоне, то для него не указываем glue record.

В свою очередь на сервере ns.net.ru который является мастером для зоны net.ru создается полная SOA запись как и полагается:

$TTL 300
net.ru.   IN   SOA   ns.net.ru. hostmaster.net.ru. (
         2009012500   ;serial
         7200      ;refresh
         900      ;retry
         2592000      ;expire
         3600      ;neg. ttl
         )
      NS   ns.net.ru.
      NS   ns2.dnshosting.com.
      MX 10   mail.net.ru.
ns.net.ru.   A   1.2.3.4
 
www.net.ru.   A   9.8.7.6
ftp.net.ru.   A   10.11.12.13
mail.net.ru.   A   11.12.13.14

На slave сервере ns2.dnshosting.com в ручную записи не создаются, но он настраивается так чтобы периодически запрашивать мастер ns.net.ru и перекачивать с него всю информацию о записях в домене, а мастер ns.net.ru настраивается так чтобы отдавать все записи о зоне при запросах с подчиненного.

Точно по такой же схеме происходит делегирование доменов третьего, четвертого да любого уровня. Делегировать можно даже одно единственное хост имя!

Например случай с делегированием домена третьего уровня. Выглядеть это будет так — в записях зоны net.ru добавляется информация с NS записями о субдомене home.net.ru (допустим, будет только один авторитарный DNS сервер для этого субдомена ns.home.net.ru IP 7.7.7.7)

$TTL 300
net.ru.   IN   SOA   ns.net.ru. hostmaster.net.ru. (
         2009012500   ;serial
         7200      ;refresh
         900      ;retry
         2592000      ;expire
         3600      ;neg. ttl
         )
      NS   ns.net.ru.
      NS   ns2.dnshosting.com.
      MX 10   mail.net.ru.
ns.net.ru.   A   1.2.3.4
 
www.net.ru.   A   9.8.7.6
ftp.net.ru.   A   10.11.12.13
mail.net.ru.   A   11.12.13.14
 
;это добавили
home.net.ru.   NS   ns.home.net.ru.
ns.home.net.ru.   A   7.7.7.7

Ну и соответственно на DNS сервере ns.home.net.ru создается зона с новой SOA записью:

$TTL 300
home.net.ru.   IN   SOA   ns.home.net.ru. adminzoni.mail.ru. (
         2009012501   ;serial
         7200      ;refresh
         900      ;retry
         2592000      ;expire
         3600      ;neg. ttl
         )
      NS   ns.home.net.ru.
ns.home.net.ru.   A   7.7.7.7
 
home.net.ru.      A   7.7.7.8
www.home.net.ru.   A   7.7.7.8
proxy.home.net.ru.   A   7.7.7.9

Был приведен синтаксис зоны как это принято в BIND и NSD. Для djbdns то, что написано выше будет выглядеть так:

Zhome.net.ru:ns.home.net.ru.:adminzoni.mail.ru.: \
2009012501:7200:900:2592000:3600:300
&amp;home.net.ru:7.7.7.7:ns.home.net.ru
+home.net.ru:7.7.7.8:300
+www.home.net.ru:7.7.7.8:300
+proxy.home.net.ru:7.7.7.9:300

До кучи, напишу заодно еще и про реверс зоны и их делегирование.
Система DNS позволяет производить обратные разрешения из IP адресов в DNS имена. Для этого в дереве имен есть специальный служебный домен под именем in-addr.arpa. Этот домен имеет 256 субдоменов, каждый из субдомменов может иметь 256 своих субдоменов, у которых могут быть 256 своих субдоменов, в которых уже будет по 256 имен. Таким образом получается структура вида a.b.c.d.in-addr.arpa. где а,b,c,d это 0-255. На эту часть DNS имен распространяются те же правила, что и на обычные имена, вот только владельцем какого-либо субдомена может стать лишь организация получившая контроль за соответствующим блоком IP адресов — например провайдер, когда покупает для своих нужд у RIPE диапазоны IP адресов. Например, если провайдер купил себе префикс с адресами 123.44.55.0/24 (256 адресов), то он может получить от RIPE (регионального регистратора) и реверс зону в которой начнет создавать PTR записи по просьбе клиентов или для своих нужд:

$TTL 300
55.44.123.in-addr.arpa.   IN   SOA   ns.net.ru. admin.net.ru. (
         2009012500   ;serial
         7200      ;refresh
         900      ;retry
         2592000      ;expire
         3600      ;neg. ttl
         )
      NS   ns.net.ru.
      NS   ns2.dnshosting.com.
 
1.55.44.123.in-addr.arpa.   PTR   hostname.net.ru.
2.55.44.123.in-addr.arpa.   PTR   imja.net.ru.
254.55.44.123.in-addr.arpa.   PTR   esheodnoija.net.ru.

Тут все просто и красиво потому, что в этом примере деление на DNS зону и IP субнет произошло по границе третьего и четвертого байта в IP адресе, а как делегировать половину субнета или только пару IP адресов из него? Скажем, клиент купил себе 8 «белых» IP адресов и захотел получить контроль над назначением реверс имен для них?
В таком случае можно сделать делегирование таким образом — в родительской зоне создаются CNAME записи на подставной домен, а он уже делегируется клиенту:

$TTL 300
55.44.123.in-addr.arpa.   IN   SOA   ns.net.ru. admin.net.ru. (
         2009012500   ;serial
         7200      ;refresh
         900      ;retry
         2592000      ;expire
         3600      ;neg. ttl
         )
      NS   ns.net.ru.
      NS   ns2.dnshosting.com.
 
1.55.44.123.in-addr.arpa.   PTR   hostname.net.ru.
2.55.44.123.in-addr.arpa.   PTR   imja.net.ru.
254.55.44.123.in-addr.arpa.   PTR   esheodnoija.net.ru.
 
;создаем подставные записи
7.55.44.123.in-addr.arpa.   CNAME   7.klient.55.44.123.in-addr.arpa.
8.55.44.123.in-addr.arpa.   CNAME   8.klient.55.44.123.in-addr.arpa.
9.55.44.123.in-addr.arpa.   CNAME   9.klient.55.44.123.in-addr.arpa.
10.55.44.123.in-addr.arpa.   CNAME   10.klient.55.44.123.in-addr.arpa.
11.55.44.123.in-addr.arpa.   CNAME   11.klient.55.44.123.in-addr.arpa.
12.55.44.123.in-addr.arpa.   CNAME   12.klient.55.44.123.in-addr.arpa.
13.55.44.123.in-addr.arpa.   CNAME   13.klient.55.44.123.in-addr.arpa.
14.55.44.123.in-addr.arpa.   CNAME   14.klient.55.44.123.in-addr.arpa.
 
;делегируем клиенту
klient.55.44.123.in-addr.arpa.   NS   ns1.klient.ru.
klient.55.44.123.in-addr.arpa.   NS   ns2.hosting.com.

Клиент принимает у себя:

$TTL 300
klient.55.44.123.in-addr.arpa.   IN   SOA   ns.klient.ru. admin.klient.ru. (
         2009012502   ;serial
         7200      ;refresh
         900      ;retry
         2592000      ;expire
         3600      ;neg. ttl
         )
      NS   ns.klient.ru.
      NS   ns2.hosting.com.
 
7.klient.55.44.123.in-addr.arpa.   PTR   host1.klient.ru.
8.klient.55.44.123.in-addr.arpa.   PTR   host2.klient.ru.
9.klient.55.44.123.in-addr.arpa.   PTR   host3.klient.ru.
10.klient.55.44.123.in-addr.arpa.   PTR   host4.klient.ru.
11.klient.55.44.123.in-addr.arpa.   PTR   host5.klient.ru.
12.klient.55.44.123.in-addr.arpa.   PTR   host6.klient.ru.
13.klient.55.44.123.in-addr.arpa.   PTR   host7.klient.ru.
14.klient.55.44.123.in-addr.arpa.   PTR   host8.klient.ru.
 
...

Да, еще одна штука вспомнилась.
Я когда работал в провайдере, так все хотел приколоться и сделать себе почтовый адрес вида terminus@1.2.3.4.in-addr.arpa, но не успел — все лень было, а потом уволился и сейчас своих реверс зон нет нигде.

Между прочим, нету никакаих объективных причин почему бы такое не работало — DNS должен будет корректно отвечать на запросы о MX записях для домена 1.2.3.4.in-addr.arpa так же как и для обычных доменов. Если есть в наличии SMTP сервер «для поиграться» + желание приколоться, то можно прописать в PTR зоне MX запись, на почтовом сервере на который указывают MX запись прописать домен, и проверить как оно будет (99% что должно работать).

Источник

By sysadmin on 16.04.2010 | FreeBSD, Linux
Метки: ,

Советы по работе с DNS зонами

Чтобы было наглядней о чем разговор идет, опишу как происходит процесс делегирования. Делегирование — это то каким образом пространство имен в DNS делится на зоны. Зона — это обособленная ветвь пространства DNS имен которая располагается на своих авторитарных DNS серверах. В зону может входить любое количество доменов нижележащего уровня — до тех пор пока они все расположены на одних и тех же авторитарных серверах, зона у них одна и та же.
Делегирование из родительской зоны происходит путем создания NS записей. В дочерней (делегированной) зоне создается полное описание зоны начиная с SOA записи. Вот, например, когда регистрируется домен второго уровня через регистратора nic.ru, то там при регистрации просят указать имена и адреса минимум двух DNS серверов которые будут считаться авторитарными для данной ветви пространства DNS имен. Для проведения делегирования не обязательно иметь под зону именно два DNS сервера — просто у nic.ru такая политика для того чтобы заставить клиентов обеспечить надежность системы. Вот эти два сервера становятся NS записями в домене ru.

Пример. Скажем, нами регистрируется домен второго уровня под названием net.ru. Авторитарными для него будут DNS сервера ns.net.ru (IP 1.2.3.4) и ns2.dnshosting.com (IP 5.6.7.9). В записях DNS серверов отвечающих за зону ru. (которыми управляет организация nic.ru) вносится такая информация:

$TTL 300
ru.   IN   SOA   ns.ripn.net. hostmaster.ripn.net. (
         4014396 ;serial
         7200   ;refresh
         900   ;retry
         2592000   ;expire
         3600   ;neg. ttl
         )
      NS   sunic.sunet.se.
      NS   e.dns.ripn.net.
      NS   ns.ripn.net.
      NS   ns5.msk-ix.net.
 
; это добавили
net.ru.   NS   ns.net.ru.
net.ru.   NS   ns2.dnshosting.com.
ns.net.ru.   A   1.2.3.4

Запись «ns.net.ru. A 1.2.3.4» называют еще «glue record», она нужна в случаях, когда имя NS сервера располагается внутри делегированной зоны. Это вспомогательная запись которую обязательно указывать в таких случаях. Без нее возникла бы ситуация, когда для того чтобы узнать IP сервера ns.net.ru надо обратиться к нему по IP (замкнутый круг). Так как второй NS расположен в чужой зоне, то для него не указываем glue record.

В свою очередь на сервере ns.net.ru который является мастером для зоны net.ru создается полная SOA запись как и полагается:

$TTL 300
net.ru.   IN   SOA   ns.net.ru. hostmaster.net.ru. (
         2009012500   ;serial
         7200      ;refresh
         900      ;retry
         2592000      ;expire
         3600      ;neg. ttl
         )
      NS   ns.net.ru.
      NS   ns2.dnshosting.com.
      MX 10   mail.net.ru.
ns.net.ru.   A   1.2.3.4
 
www.net.ru.   A   9.8.7.6
ftp.net.ru.   A   10.11.12.13
mail.net.ru.   A   11.12.13.14

На slave сервере ns2.dnshosting.com в ручную записи не создаются, но он настраивается так чтобы периодически запрашивать мастер ns.net.ru и перекачивать с него всю информацию о записях в домене, а мастер ns.net.ru настраивается так чтобы отдавать все записи о зоне при запросах с подчиненного.

Точно по такой же схеме происходит делегирование доменов третьего, четвертого да любого уровня. Делегировать можно даже одно единственное хост имя!

Например случай с делегированием домена третьего уровня. Выглядеть это будет так — в записях зоны net.ru добавляется информация с NS записями о субдомене home.net.ru (допустим, будет только один авторитарный DNS сервер для этого субдомена ns.home.net.ru IP 7.7.7.7)

$TTL 300
net.ru.   IN   SOA   ns.net.ru. hostmaster.net.ru. (
         2009012500   ;serial
         7200      ;refresh
         900      ;retry
         2592000      ;expire
         3600      ;neg. ttl
         )
      NS   ns.net.ru.
      NS   ns2.dnshosting.com.
      MX 10   mail.net.ru.
ns.net.ru.   A   1.2.3.4
 
www.net.ru.   A   9.8.7.6
ftp.net.ru.   A   10.11.12.13
mail.net.ru.   A   11.12.13.14
 
;это добавили
home.net.ru.   NS   ns.home.net.ru.
ns.home.net.ru.   A   7.7.7.7

Ну и соответственно на DNS сервере ns.home.net.ru создается зона с новой SOA записью:

$TTL 300
home.net.ru.   IN   SOA   ns.home.net.ru. adminzoni.mail.ru. (
         2009012501   ;serial
         7200      ;refresh
         900      ;retry
         2592000      ;expire
         3600      ;neg. ttl
         )
      NS   ns.home.net.ru.
ns.home.net.ru.   A   7.7.7.7
 
home.net.ru.      A   7.7.7.8
www.home.net.ru.   A   7.7.7.8
proxy.home.net.ru.   A   7.7.7.9

Был приведен синтаксис зоны как это принято в BIND и NSD. Для djbdns то, что написано выше будет выглядеть так:

Zhome.net.ru:ns.home.net.ru.:adminzoni.mail.ru.: \
2009012501:7200:900:2592000:3600:300
&home.net.ru:7.7.7.7:ns.home.net.ru
+home.net.ru:7.7.7.8:300
+www.home.net.ru:7.7.7.8:300
+proxy.home.net.ru:7.7.7.9:300

До кучи, напишу заодно еще и про реверс зоны и их делегирование.
Система DNS позволяет производить обратные разрешения из IP адресов в DNS имена. Для этого в дереве имен есть специальный служебный домен под именем in-addr.arpa. Этот домен имеет 256 субдоменов, каждый из субдомменов может иметь 256 своих субдоменов, у которых могут быть 256 своих субдоменов, в которых уже будет по 256 имен. Таким образом получается структура вида a.b.c.d.in-addr.arpa. где а,b,c,d это 0-255. На эту часть DNS имен распространяются те же правила, что и на обычные имена, вот только владельцем какого-либо субдомена может стать лишь организация получившая контроль за соответствующим блоком IP адресов — например провайдер, когда покупает для своих нужд у RIPE диапазоны IP адресов. Например, если провайдер купил себе префикс с адресами 123.44.55.0/24 (256 адресов), то он может получить от RIPE (регионального регистратора) и реверс зону в которой начнет создавать PTR записи по просьбе клиентов или для своих нужд:

$TTL 300
55.44.123.in-addr.arpa.   IN   SOA   ns.net.ru. admin.net.ru. (
         2009012500   ;serial
         7200      ;refresh
         900      ;retry
         2592000      ;expire
         3600      ;neg. ttl
         )
      NS   ns.net.ru.
      NS   ns2.dnshosting.com.
 
1.55.44.123.in-addr.arpa.   PTR   hostname.net.ru.
2.55.44.123.in-addr.arpa.   PTR   imja.net.ru.
254.55.44.123.in-addr.arpa.   PTR   esheodnoija.net.ru.

Тут все просто и красиво потому, что в этом примере деление на DNS зону и IP субнет произошло по границе третьего и четвертого байта в IP адресе, а как делегировать половину субнета или только пару IP адресов из него? Скажем, клиент купил себе 8 «белых» IP адресов и захотел получить контроль над назначением реверс имен для них?
В таком случае можно сделать делегирование таким образом — в родительской зоне создаются CNAME записи на подставной домен, а он уже делегируется клиенту:

$TTL 300
55.44.123.in-addr.arpa.   IN   SOA   ns.net.ru. admin.net.ru. (
         2009012500   ;serial
         7200      ;refresh
         900      ;retry
         2592000      ;expire
         3600      ;neg. ttl
         )
      NS   ns.net.ru.
      NS   ns2.dnshosting.com.
 
1.55.44.123.in-addr.arpa.   PTR   hostname.net.ru.
2.55.44.123.in-addr.arpa.   PTR   imja.net.ru.
254.55.44.123.in-addr.arpa.   PTR   esheodnoija.net.ru.
 
;создаем подставные записи
7.55.44.123.in-addr.arpa.   CNAME   7.klient.55.44.123.in-addr.arpa.
8.55.44.123.in-addr.arpa.   CNAME   8.klient.55.44.123.in-addr.arpa.
9.55.44.123.in-addr.arpa.   CNAME   9.klient.55.44.123.in-addr.arpa.
10.55.44.123.in-addr.arpa.   CNAME   10.klient.55.44.123.in-addr.arpa.
11.55.44.123.in-addr.arpa.   CNAME   11.klient.55.44.123.in-addr.arpa.
12.55.44.123.in-addr.arpa.   CNAME   12.klient.55.44.123.in-addr.arpa.
13.55.44.123.in-addr.arpa.   CNAME   13.klient.55.44.123.in-addr.arpa.
14.55.44.123.in-addr.arpa.   CNAME   14.klient.55.44.123.in-addr.arpa.
 
;делегируем клиенту
klient.55.44.123.in-addr.arpa.   NS   ns1.klient.ru.
klient.55.44.123.in-addr.arpa.   NS   ns2.hosting.com.

Клиент принимает у себя:

$TTL 300
klient.55.44.123.in-addr.arpa.   IN   SOA   ns.klient.ru. admin.klient.ru. (
         2009012502   ;serial
         7200      ;refresh
         900      ;retry
         2592000      ;expire
         3600      ;neg. ttl
         )
      NS   ns.klient.ru.
      NS   ns2.hosting.com.
 
7.klient.55.44.123.in-addr.arpa.   PTR   host1.klient.ru.
8.klient.55.44.123.in-addr.arpa.   PTR   host2.klient.ru.
9.klient.55.44.123.in-addr.arpa.   PTR   host3.klient.ru.
10.klient.55.44.123.in-addr.arpa.   PTR   host4.klient.ru.
11.klient.55.44.123.in-addr.arpa.   PTR   host5.klient.ru.
12.klient.55.44.123.in-addr.arpa.   PTR   host6.klient.ru.
13.klient.55.44.123.in-addr.arpa.   PTR   host7.klient.ru.
14.klient.55.44.123.in-addr.arpa.   PTR   host8.klient.ru.
 
...

Да, еще одна штука вспомнилась.
Я когда работал в провайдере, так все хотел приколоться и сделать себе почтовый адрес вида terminus@1.2.3.4.in-addr.arpa, но не успел — все лень было, а потом уволился и сейчас своих реверс зон нет нигде.

Между прочим, нету никакаих объективных причин почему бы такое не работало — DNS должен будет корректно отвечать на запросы о MX записях для домена 1.2.3.4.in-addr.arpa так же как и для обычных доменов. Если есть в наличии SMTP сервер «для поиграться» + желание приколоться, то можно прописать в PTR зоне MX запись, на почтовом сервере на который указывают MX запись прописать домен, и проверить как оно будет (99% что должно работать).

Источник

By sysadmin on 19.03.2010 | FreeBSD, Linux
Метки: , , , , ,

Несколько советов по использованию bash

Тут приведены некоторые полезные хитрости, направленные на более удобное использование командной строки. Все мы не хотим повторно набирать какую-то длинную команду и ищем ее в истории. Тут — пара трюков от том, как можно энто самое удобство малость повысить.

1. Потеря комманд в .bash_history

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

bash по умолчанию пишет в историю набранные за сеанс команды только при своем закрытии (перед самоликвидацией). Поэтому при открытии нового терминала в другой вкладке вы не увидите только что набранные команды из первой вкладки — они еще не записаны в хистори.

К тому же закрыв первый терминал, а потом второй вы не найдете в истории команд набранных в первом терминале. Потому что по умолчанию bash не дописывает файл .history, а переписывает.

Исправить ситуацию можно, дописав в конфигурационный файл ~/.bashrc пару строк

    shopt -s histappend
    PROMPT_COMMAND='history -a'

Теперь каждая введенная вами команда будет писаться в историю сразу же. Не бойтесь — дырку на жестком месте такая конфигурация не протрет. Не так уж часто вы команды в баше набираете. 🙂 Да и слава богу кеширование дисков пока еще рулит.

2. Эвристическое исправление ошибок директорий

Если дописать такую строчку

    shopt -s cdspell

то bash будет пытаться исправлять допущенные вами опечатки (пропуски и перестановки символов, например /ect/init.d вместо /etc/init.d) в пути у команды cd. Не бойтесь, у rm такая фича работать уже не будет. Только у cd.

3. Не писать в историю подряд идущие строки-дубликаты

Пишем в ~/.bashrc

    export HISTCONTROL="ignoredups"

А если вы не хотите, чтобы в историю попадали вызовы каких-то «неинформативных» команд, то их логирование можно запретить:

    export HISTIGNORE="&:ls:[bf]g:exit"

После этой команды в хистори не будут писаться команды &, ls, bg, fg, exit. Можно дописать и свои, через двоеточие, можно использовать шаблоны.

4. Не разрывать многострочные команды

Еще команда в конфигурационный файл

    shopt -s cmdhist

5. Поиск по истории команд

Иногда команды бывают большими и сложными, и чтобы заново ее не писать и не искать по истории 100 раз нажимая «вверх», можно воспользоваться поиском.

Если вы помните кусочек команды которую хотите найти, то можно просто нажать в bash’e комбинацию Ctrl + R и набрать этот кусочек. bash вам покажет последнюю команду с такой подстрокой. Можно продолжать нажимать Ctrl + R и bash будет выдавать более старые подходящие команды, подходящие под искомую строку.

6. Вернуться в предыдущую директорию

Когда мы работаем в какой-то директории, и нам нужно «выбраться» в другую директорию, что-то там поделать и вернуться назад, можно воспользоваться «cd -«, например

    [toor@localhost html]$ cd /var/www/html
    [toor@localhost html]$ cd /etc/
    [toor@localhost etc]$ vi my.cnf
    [toor@localhost etc]$ cd -
    /var/www/html
    [toor@localhost html]$

Эта команда вернет нас в директорию где мы были раньше.

7. Хранить дату выполнения в истории команд bash

По умолчанию утилита history, не сохраняет в .bash_history время исполнения каждой команды.

В баше трейтьей версии сделать это можно и весьма просто. Если объявить глобальную переменную HISTTIMEFORMAT с форматом выводимых данных, то утилита history будет сохранять и выводить эту дату.

Итак, пишем в ~/.bashrc строчку

export HISTTIMEFORMAT='%h %d %H:%M:%S '

После этого в .bash_history перед каждой командой появится коментарий с цифрой — временем выполнения этой команды в формате timestamp:

#1260787129
htop
#1260802594
export HISTTIMEFORMAT='%h %d %H:%M:%S '
#1260802598
history | grep squid
#1260802658
mc
#1260802777
chown -R svn:svn svn

А командочка history будет выдавать историю данных с датой в формате, который мы переменной задали (в похожем формате выдают дату и время утилита ls):

995  Dec 14 13:38:49 htop
996  Dec 14 17:56:34 export HISTTIMEFORMAT='%h %d %H:%M:%S '
997  Dec 14 17:56:38 history | grep squid
998  Dec 14 17:57:38 mc
999  Dec 14 17:59:37 chown -R svn:svn svn

Но можно сделать и по ГОСТУ, в приятном русскому глазу виде «ДД.ММ.ГГГГ»

export HISTTIMEFORMAT='%d.%m.%Y %H:%M:%S '

А можно и в формате ISO: «YYYY-MM-DD»

export HISTTIMEFORMAT='%Y-%m-%d %H:%M:%S '
By sysadmin on 14.12.2009 | FreeBSD, Linux
Метки: , , , ,

Простая генерация паролей

Достаточно часто на практике приходится генерировать пароли для разных аккаунтов и сервисов — почты, ftp, samba и просто для нерадивых пользователей, теряющих и забывающих пароли при каждом удобном случае. Очевидно, что придумать новый пароль достаточно просто, но его устойчивость к взлому, как правило, будет сомнительной, поскольку любимые наши пароли — 111, 12345 и «интернет», а также год рождения, номер паспорта или мобильного телефона — известны всем и каждому.

Поэтому для себя я использовал простенький скрипт следующего вида (файл passgen.sh):

#!/bin/bash
echo `tr -cd [:digit:] < /dev/urandom | head -c8`

Этому скрипту необходимо дать права на выполенение

chmod u+x passgen.sh

и в дальнейшем использовать из консоли:

~$ ./passgen.sh
93723588

Как видно из примера, скрипт позволяет получить случайное восьмизначное число, которое и используется в качестве пароля. Немного поэкспериментировав, мы можем еще усилить стойкость пароля и улучшить его читабельность, изменив наш минискрипт следующим образом (файл genpass.sh):

#!/bin/bash
x=`tr -cd [:alnum:] < /dev/urandom | head -c8`
echo ${x:0:4}-${x:4:4}

«Расширенная» версия генератора позволит нам получать буквенно-цифровые пароли в формате XXXX-XXXX:

~$ ./genpass.sh
sv81-1AxP
By sysadmin on 18.06.2009 | FreeBSD, Linux
Метки: , , , ,

Как удалить из кэша DNS сервера Bind конкретную запись, без перезагрузки всего кэша

Для удаления отдельной записи в кэше Bind нужно использовать команду «rndc flushname»

Запрашиваем имя mx.example.ru у сервера 127.0.0.1:

   $>  dig +short @127.0.0.1 mx.example.ru
   192.168.168.168

Сохраняем для изучения дамп с содержимым кэша:

   $>  rndc dumpdb -all

Находим в нем искомое имя, чтобы убедится, что оно в кэше:

   $> grep mx.example.ru /var/bind/named_dump.db
   mx.example.ru.             431988  A       192.168.168.168

Выполняем команду для удаления mx.example.ru из кэша:

   $> rndc flushname mx.example.ru.

Убедимся, что имя удалилось:

   rm /var/bind/named_dump.db 
   rndc dumpdb -all
   grep mx.example.ru /var/bind/named_dump.db
By sysadmin on 06.05.2009 | FreeBSD, Linux
Метки: , , , ,

Коды ответов (ошибок) HTTP сервера

При любом HTTP запросе сервер сначала возвращает код ответа на HTML запрос. Проанализировав этот ответ можно сделать вывод о том, был ли запрос выполнен успешно, или в процессе обработки запроса произошла ошибка.

Коды ответа HTTP сервера могут принадлежать следующим группам:
1xx — Информационный ответ
2xx — Успешная обработка запроса
3xx — Переадресация (редирект)
4xx — Неполный запрос к серверу
5xx — При обработке запроса произошла ошибка

Естественно, что кодов ответа в каждой группе не по 100. Браузер (клиент IE, Opera, Mozilla и т.д.), получая от сервера тот или иной код, сам решает как его интерпретировать. Если код клиенту неизвестен, то как минимум он может определить диапазон кода и повести себя соответствующим образом.

Информационные ответы

100 Continue
Часть запроса принята. Как правило это занчит, что можно отправлять следующую часть запроса.

101 Switching Protocols
Сервер производит переключение протоколов в соответствии с заголовком Upgrade.

Успешная обработка запроса

200 OK
Запрос обработан успешно.

201 Created
Данный код используется когда происходит создание нового URI. Вместе с кодом сервер посылает заголовок Location с адресом нового URI.

202 Accepted
Запрос принят и обрабатывается. В теле ответа как правило содержится дополнительная информация.

203 Non-Authoritative Information
Ответ означает, что информация получена из ненадежного источника (например, с другого сервера).

204 No Content
Запрос обработан, но в ответ ничего не возвращается. Как правило используется если в ответ на запрос не нужно обновлять содержимое документа.

205 Reset Content
Означает, что содержимое документа должно быть сброшено в начальное состояние. Обычно используется при очистке форм ввода данных..

206 Partial Content
При данном ответе возвращается лишь часть данных. Обычно используется если клиент запросил часть данных с использованием заголовка Range.

Переадресация

300 Multiple Choices
Означает, что существует несколько вариантов запрашиваемой страницы. Например, сайт, переведенный на несколько языков.

301 Moved Permanently
Данный ответ означает, что данный документ был перемещен и клиенту следует изменить все ссылки на данный документ его новым местоположением.

302 Moved Temporarily
Документ временно перемещен в другое место.

303 See Other
Данный документ можно найте по другим ссылкам. Список ссылок передан в теле ответа.

304 Not Modified
Данный код ответа возвращается если был запрос lf-Modified-Since, и документ не изменялся с указанной даты.

305 Use Proxy
Доступ к документу должен осуществляться через proxy-сервер, адрес которого указан в Location.

Неполные запросы клиента

400 Bad Request
Ошибка в строке запроса.

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

402 Payment Required
Данный код зарезервирован на будущее. Видимо будет означать, что запрошенный документ является платным ресурсом.

403 Forbidden
Запрос не будет выполнен по какой-либо причине.

404 Not Found
Запрашиваемого документа нет на сервере.

405 Method Not Allowed
Означает, что метод, используемый клиентом, не поддерживается.

406 Not Acceptable
Ресурс существует, но не в той форме, что клиент запросил. Например, может различаться язык документа.

407 Proxy Authentication Required
Для Proxy-сервера необходима авторизация.

408 Request Time-out
Сервер разорвал соединение из-за превышенного таймаута.

409 Conflict
Запрос конфликтует с другим запросом.

410 Gone
Данный код означает, что документ был удален с сервера.

411 Length Required
Пропущено необходимое поле в заголовке запроса Content-Length.

412 Precondition Failed
Условие указанное в заголовке не выполняется.

413 Request Entity Too Large
Слишком большое тело запроса.

414 Request-URI Too Long
Слишком длинный URI в запросе.

415 Unsupported Media Type
Сервер не поддерживает указанный формат данных.

Ошибки сервера

500 Internal Server Error
Внутренняя ошибка сервера. Например, ошибка при выполнении скрипта.

501 Not Implemented
Недопустимое действие.

502 Bad Gateway
Недопустимый ответ с другого ресурса.

503 Service Unavailable
Данный код означает, что указанный сервис временно недоступен.

504 Gateway Time-out
Превышен таймаут ожидания от другого ресурса

505 HTTP Version not supported
Данная версия протокола HTTP не поддерживается сервером.

By sysadmin on 28.04.2009 | Development, FreeBSD, Linux, Windows
Метки: , , , ,

Помещение OpenSSH (SSH) пользователей в изолированное sftp окружение

Начиная с релиза 4.9 в OpenSSH появилась возможность помещать отдельных пользователей в изолированное окружение.
Помещение в chroot управляется через директиву ChrootDirectory, задаваемую в конфигурационном файле sshd_config.
При задействовании sftp-server интегрированного в sshd, при этом не требуется формирование специального chroot окружения.

Пример помещения в chroot:

AllowUsers user1, user2, user3@192.168.1.1, user3@192.168.2.*
Match user user2, user3
ChrootDirectory /home/%u
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp
 
Subsystem       sftp    internal-sftp

Пользователь user1 имеет возможность входа в shell, в то время как user2 и user3 могут работать только по sftp,
без возможность выхода за пределы своей домашней директории.
При этом user3 может входить только с машины 192.168.1.1 и подсети 192.168.2.0/24.

Опция «ForceCommand internal-sftp» разрешает пользователю использовать только sftp, встроенный в sshd.

При необходимости пускать пользователей в shell, необходимо сформировать минимальное chroot-окружение,
скопировав туда необходимые для работы программы и библиотеки.

Например, создадим для пользователей, входящих в группу chrootusers, окружение /home/chroot

В /etc/ssh/sshd_config добавим:

Match Group chrootusers
ChrootDirectory /home/chroot
X11Forwarding no
AllowTcpForwarding no

Для формирования chroot можно использовать скрипт make_chroot_jail.sh, поддерживающий Debian, Suse, Fedora и Redhat Linux:
http://www.fuschlberger.net/programs/ssh-scp-sftp-chroot-jail/

Также можно порекомендовать скрипт sync_chroot.pl ,
который автоматически находит и копирует в chroot недостающие библиотеки для находищихся внутри chroot программ.

Рассмотрим создание chroot в Debian или Ubuntu Linux.

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

apt-get install sudo debianutils coreutils

Копируем скрипт make_chroot_jail.sh:

wget http://www.fuschlberger.net/programs/ssh-scp-sftp-chroot-jail/make_chroot_jail.sh
chmod 700 ./make_chroot_jail.sh

Определяем список программ для chroot-окружения, в make_chroot_jail.sh находим строки и меняем на свое усмотрение:

...
elif [ "$DISTRO" = DEBIAN ]; then
APPS="/bin/bash /bin/cp /usr/bin/dircolors /bin/ls /bin/mkdir \
/bin/mv /bin/rm /bin/rmdir /bin/sh /bin/su /usr/bin/groups \
/usr/bin/id /usr/bin/rsync /usr/bin/ssh /usr/bin/scp \
/sbin/unix_chkpwd /usr/bin/vi"
else
...

Формат вызова скрипта:
make_chroot_jail.sh логин путь_к_shell путь_к_chroot

Для создания окружения с shell по умолчанию bash для пользователя user1 выполним:

./make_chroot_jail.sh user1 /bin/bash /home/jail

При этом скрипт автоматически скопирует все недостающие в chroot файлы и создаст директорию /home/jail/user1

После обновления базовой системы, обновить chroot можно командой:

./make_chroot_jail.sh update /bin/bash /home/jailsync_chrootscan_ldd_link
By sysadmin on 23.03.2009 | Linux
Метки: , , ,