Начинаю цикл статей с интересными задачками по Bash.
Задачка о том, как вырезать часть файла конфигурации apache.
Задача: Известно, что на сервере Apache2, который работает в CentOS v.6, настроено около 50 сайтов. Дальше опциональное условие: все они описаны минимум в трех конфигурационных файлах (их расположение не известно). Нужно написать Bash скрипт, который получит из трех конфигурационных файлов, настройки для 4-х сайтов и сохранит их в отдельные файлы или в один отдельный файл. Список сайтов:
- website1.com
- website2.net
- website3.info
- website4.org
Полагаю, что может быть два типа читателей:
- Тот, кто ищет головоломку.
- Тот, кто ищет решение.
Для второго типа читателей выкладываю дальнейший скрипт:
Раскрой меня
# Объявляем список сайтов
sites=(website1.com website2.net website3.info website4.org);
# Создаем цикл проходки по списку сайтов
for website in $sites;
do
# Получаем информацию о конфиге, в котором описан хост
config=$(apachectl -S 2>&1 |grep "80 namevhost $website" |cut -d "(" -f 2 |cut -d ":" -f1);
if [[ $config != "" ]];
then
# Описание начала конфига
start=$(apachectl -S 2>&1 |grep "80 namevhost $website" |cut -d ":" -f 2 |cut -d ")" -f 1);
# Описание конца конфига
eof=$(cat $config |wc -l)
end=$(cat -n $config |sed -n "$start,$eof"p |grep "</Virtual.ost>" |sed -n '1p' |awk '{print $1}');
# Вырезаем настройки хоста из конфига
sed -n "$start","$end"p $config >> extracted_hosts.conf;
echo "" >> extracted_hosts.conf;
else
echo "check $website";
fi;
done
# Создаем цикл проходки по списку ssl сайтов
for website in $sites;
do
# Получаем информацию о конфиге, в котором описан хост
config=$(apachectl -S 2>&1 |grep "443 namevhost $website" |cut -d "(" -f 2 |cut -d ":" -f1);
if [[ $config != "" ]];
then
# Описание начала конфига
start=$(apachectl -S 2>&1 |grep "443 namevhost $website" |cut -d ":" -f 2 |cut -d ")" -f 1);
# Описание конца конфига
eof=$(cat $config |wc -l)
end=$(cat -n $config |sed -n "$start,$eof"p |grep "</Virtual.ost>" |sed -n '1p' |awk '{print $1}');
# Вырезаем настройки хоста из конфига
sed -n "$start","$end"p $config >> extracted_hosts.conf;
echo "" >> extracted_ssl_hosts.conf;
else
echo "check $website";
fi;
done
Если изменить имя файла extracted_host.conf
на $website.conf
, тогда конфиг каждого сайта будет сохранен в отдельный файл.