Форум программистов, компьютерный форум, киберфорум
Dimedrol
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  

Программа createhost. Создаем хосты без лишних телодвижений

Запись от Dimedrol размещена 03.04.2012 в 12:57
Показов 4496 Комментарии 0

Сегодня поговорим о программе, которая будет создавать локальные хосты. Это очень удобно. Для каждого проекта отдельный хост. Использовать мы будет bash, директории хостов будут храниться в /sites/.
Поехали!
Создадим директорию /sites

sudo mkdir /sites

Давайте будем хранить нашу программу в директории /usr/bin/. Создадим поддиректорию createhost

sudo mkdir /usr/bin/createhost

Теперь создадим шаблон, по которому будет создаваться файл настроек. Воспользуемся файлом 000-default, который находится в /etc/apache2/sites-enabled/

sudo cp /etc/apache2/sites-enabled/000-default /usr/bin/createhost/host.tpl

Нам придется немного отредактировать полученный шаблон. Воспользуемся редактором vim ( или nano).

sudo vim /usr/bin/createhost/host.tpl

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

<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName {NAME}
DocumentRoot /sites/{NAME}

<Directory /sites/{NAME}/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>

ErrorLog ${APACHE_LOG_DIR}/{NAME}_error.log
CustomLog ${APACHE_LOG_DIR}/{NAME}_access.log combined
</VirtualHost>


Сохраним. Шаблон готов.
Займемся написанием самого скрипта. Как уже было сказано, использовать мы будем bash.

Bash
1
sudo vim /usr/bin/createhost/createhost.sh
Как вы могли заметить, многие операции проходят от имени суперпользователя. Давайте проверим, является ли пользователь суперпользователем. Суперпользователь имеет нулевой айди в системе. Воспользуемся этим.

Bash
1
2
3
if [ "$UID" -ne 0 ]; then
echo 'access denied'; exit
fi
Как мы будем передавать имя нового хоста? Давайте так:
./createhost.sh hostname
Проверим, передал ли пользователь нам имя хоста
Bash
1
2
3
if [ -z $1 ]; then
exit
fi
Пришло время проверить на существование хоста.
Проверяем директорию ./sites
Bash
1
2
3
if [ -d /sites/$1 ]; then
echo $1' exists in /sites/ directory';exit
fi
Проверяем директорию /etc/apache2/sites-enabled/

Bash
1
2
3
if [ -f /etc/apache2/sites-enabled/$1 ]; then
echo $1' exists in sites-enabled directory';
fi
Теперь хорошо бы проверить файл hosts. Тут все немного посложнее. Воспользуемя командой grep. Если grep что-то нашел в файле, вернет 0. Есть еще один момент - очень не красиво будет, если эта программа выведет на экран результат своей работы. Как же это исправить? Да все очень просто. В Linux есть замечательная "черная дыра" - /dev/null. Перенаправим вывод программы в дыру:

Bash
1
grep -e "$1" /etc/hosts >> /dev/null
Теперь проверим, какой код вернула программа (если я не ошибаюсь, почти все программы при положительном результате возвращают 0 ).

Bash
1
2
3
if [ $? -eq 0 ]; then
echo $1' exists in hosts file';
fi
Переменная $? хранит результат выполнения последней программы. Если grep вернул 0 значит хост был найден в этом файле.
Все, с проверками мы покончили. Давайте теперь создадим директорию с именем хоста:

Bash
1
mkdir /sites/$1
Создадим там файл index.html, чтобы можно было сразу проверить работоспособность хоста.

Bash
1
echo "<h1>Hello from $1</h1>" > /sites/$1/index.html
Пришло время заняться настройкой апача. Для работы с шаблоном мы будем использовать программу sed. Почитайте о ней в интернете. Замечательная программа. Очень помогает при решении некоторых задачь.

Bash
1
sed -e "s;{NAME};$1;" /usr/bin/createhost/host.tpl > /etc/apache2/sites-enabled/$1
Все, с апачем мы закончили. Перейдем к файлу hosts. Добавим в конец файла наш хост.
Bash
1
echo "127.0.0.1 $1" >> /etc/hosts
Теперь пришло время перегрузить апач.
Bash
1
/etc/init.d/apache2 reload
Результат перезагрузки можно тоже направить в "черную дыру".
Bash
1
/etc/init.d/apache2 reload >> /dev/null
Но тогда хорошо бы добавить еще одну проверку после перезагрузки
Bash
1
2
3
4
5
if [ $? -eq 0 ]; then
echo "http://$1/ created!"
else
echo "Error"
fi
Все, наша программа готова. Закрываем редактор и меняем права на файл нашей программы:
chmod +x /usr/bin/createhost/createhost.sh
Пробуем создать хост
dmitry@dmitry:/$ cd /usr/bin/createhost/
dmitry@dmitry:/usr/bin/createhost$ ./createhost.sh
access denied
dmitry@dmitry:/usr/bin/createhost$ sudo ./createhost.sh
dmitry@dmitry:/usr/bin/createhost$ sudo ./createhost.sh cyberforum
http://cyberforum/ created!


Проверяем... Да, мы создали хост.
Приложение
createhost.sh
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/bin/bash
if [ "$UID" -ne 0 ]; then
echo 'access denied'; exit
fi
if [ -z $1 ]; then
exit
fi
if [ -d /sites/$1 ]; then
echo $1' exists in /sites/ directory';exit
fi
if [ -f /etc/apache2/sites-enabled/$1 ]; then
echo $1' exists in sites-enabled directory';exit
fi
grep -e "$1" /etc/hosts >> /dev/null
if [ $? -eq 0 ]; then
echo $1' exists in hosts file';exit
fi
mkdir /sites/$1
echo "<h1>Hello from $1</h1>" > /sites/$1/index.html
sed -e "s;{NAME};$1;" /usr/bin/createhost/host.tpl > /etc/apache2/sites-enabled/$1
echo "127.0.0.1 $1" >> /etc/hosts
/etc/init.d/apache2 reload >> /dev/null
if [ $? -eq 0 ]; then
echo "http://$1/ created!"
else
echo "Error"
fi

host.tpl
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    ServerName {NAME}
    DocumentRoot /sites/{NAME}
 
    <Directory /sites/{NAME}/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
    </Directory>
 
    ErrorLog ${APACHE_LOG_DIR}/{NAME}_error.log
    CustomLog ${APACHE_LOG_DIR}/{NAME}_access.log combined
</VirtualHost>

В следующий раз попробуем реализовать программу удаления хостов.
Размещено в Linux
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru