Программирование на BASH

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

Пример 1. Резервное копирование каталога

Задача: Существует некая рабочая папка с важными документами, нам нужен скрипт который создавал бы её архивную копию, и сохранял в другом месте (резервном хранилище). И также предусмотреть автоматическое удаление старых архивов в хранилище, допустим будем хранить не более 9-ти резервных копий. Для архивации будем использовать утилиту tar, с опцией сжатия в gzip архив.

#!/bin/bash
ARCHIVE_DIR="/srv/archive"
SOURCE_DIR="/home/user/docs"
FILENAME=`date +%F`".tar.gz"
pushd ${SOURCE_DIR} > /dev/null
tar -czf ${ARCHIVE_DIR}/${FILENAME} ./
if [ $? = 0 ] ; then
echo "OK: archive ${FILENAME} create"
else
echo 'ERROR: archive not create'
fi
popd > /dev/null
MAX_COPIES=9
NCOPIES=`ls -1v ${PATH_TO_COPIES} | wc -l`
if [ ${NCOPIES} -gt ${MAX_WEEKS} ] ; then
COUNT_FILES_FOR_DEL=`expr ${NCOPIES} - ${MAX_COPIES}`
FOR_DEL=`ls -1v ${ARCHIVE_DIR} | head -n ${COUNT_FILES_FOR_DEL}`
for ITEM in ${FOR_DEL}
do
rm -rf ${ARCHIVE_DIR}/${ITEM}
done
fi

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

А так выглядит само архивное хранилище:

Пример 2. создание большого количества пользователей на FTP-сервере.

В этом примере, будем исходить из предположения что на сервере установлена утилита pwgen, являющаяся генератором паролей. А также в качестве в качестве службы FTP используется демон vsftpd. Этот сценарий может пригодиться например при создании мест для хранения студенческих сайтов. В качестве единственного параметра, ему необходимо будет передать имя файла, содержащего список имён будущих пользователей. По завершению работы сценария, будет создан файл, в котором будут сохранены сгенерированные пароли пользователей, чтобы их затем можно было сообщить соответсвующим людям

#!/bin/bash
if [ -z $1 ] ; then
echo "Usage: $0 userlistfile"
exit
fi
PASSFILE="/root/user_password.txt"
if [ -f $1 ] ; then
LIST=`cat $1`
pushd /var/www/html/pages
for ITEM in $LIST
do
echo "create user $ITEM"
useradd $ITEM -d $PWD/$ITEM
PASS=`pwgen 16 1`
{
echo $PASS
echo $PASS
} | passwd $ITEM
echo $ITEM >> /etc/vsftpd/chroot_list
echo "$ITEM : $PASS" >> $PASSFILE
done
popd
service vsftpd restart
else
echo "File $USERLIST_FILE not found"
fi

Пояснение. Для начала, проверяем не забыл ли администратор указать нам в каком файле искать список пользователей. Если забыл, то выводим краткое сообщение об использовании сценария, и завершаем его. Если же всё хорошо, то продолжаем выполнение. Задаём имя файла паролей. Если файл со списком пользователей существует, то переходим к основной части сценария. В переменную LIST заносим имена пользователей, затем меняем рабочий каталог, сохраняя в стеке текущий. В цикле, для каждого имени из файла создаём учётную запись на сервере, указывая при создании новый домашний каталог, генерируем ему пароль из 16 символов, и дважды направляем его на вход утилите которая устанавливает пароль для пользователя. Записываем имя пользователя в файл /etc/vsftpd/chroot_list (это для того чтобы служба vsftpd не давала пользователю при подключении доступа к внешним по отношению к домашнему каталогам). И сохраняем имя пользователя и пароль в файле. По завершению цикла, возвращаемся в каталог из которого всё начиналось, и перезапускаем службу vsftpd для того чтобы она приняла изменения в составе пользователей системы.

Наверх

html counterсчетчик посетителей сайта

Автор: Бритвин Станислав Евгеньевич. e-mail: britvin.slawa@yandex.ru ВоГУ ФПМКТиФ группа ПМ-31, Вологда 2016г.