LINUX.ORG.RU

Получить список virtualhosts [bash]

 , , , ,


0

2

Здравствуйте, товарищи!

Назрела необходимость найти\написать какой-нибудь баш-скрипт для парсинга конфигов апача чтобы получить список всех виртуалхостов, алиасов и директорий сайтов, так как бывают ситуации где httpd -S не справляется.

Может у кого-то есть на примете готовые решения или придется писать с нуля? Что посоветуете?


Вот что я набросал:

#!/bin/bash
apachepath='/etc/httpd/'
exp4fnd='-type f -name '*.conf''
sname=$(find $apachepath $exp4fnd -exec cat {} \;| grep ServerName | awk '{print $2}')
salias=$(find $apachepath $exp4fnd -exec cat {} \;| grep ServerAlias | awk '{print $2}')
sdocroot=$(find $apachepath $exp4fnd -exec cat {} \;| grep DocumentRoot | awk '{print $2}')
#echo -e "$sname" "\n"
#echo -e "$salias" "\n"
#echo -e "$sdocroot" "\n"
printf "%-30s | %-30s | %-30s" "$sname" "$salias" "$sdocroot"

изначально задумано что он будет находить и выводить вторую колонку, то есть значение ServerName, ServerAlias и DocumentRoot, и потом в три колонки это всё показывать, но работает это всё отвратительно. Как лучше это можно реализовать?

emostar
() автор топика
Последнее исправление: emostar (всего исправлений: 1)
Ответ на: комментарий от emostar

как-то так (не проверял)

#! /bin/bash
PARSER='
/ServerName/ {snm = $2}
/ServerAlias/ {sal = $2}
/DocumentRoot/ {drt = $2}
ENDFILE {printf "%-30s | %-30s | %-30s\n",snm,sal,drt}
'
find /etc/httpd/ -type f -name '*.conf' -exec awk "$PARSER" {} \;
ananas ★★★★★
()

РЕШЕНО

Дописал наконец-то:

#!/bin/bash
#to enable debug mode uncomment the string below
#do not enable on REAL PRODUCTION USE!
#set -x
# Author: Oliver Rex, http://triforceweb.com/
# run this script latest version: wget -q http://triforceweb.com/vhostdetector.sh -O - | bash
	INVERSE='\033[7m'  #  ${INVERSE}
	NORMAL='\033[0m'   #  ${NORMAL}

#in case of fire: steal, kill, fuck the geese, wait for a dial tone response
whereismywebserver () {
	software80=$(netstat -tulpn | grep :80 | awk -F "/" '{print $NF}' | sed s/' '//g) #last word from output
	if [[ $software80 ]]; then
		softwareconf=$(echo $software80'.conf') #filename to locate
		locate $softwareconf || whereis $software80 || which $software80 #a last hope
	else
		echo -en Unfortunately Apache is not present on this server. Your web daemon is not found on port 80 using netstat. '\n' Please use ${INVERSE}"lsof -i :80 | grep LISTEN"${NORMAL} or try to start webserver daemon! '\n'
		exit 0
	fi
	if [ ! $software80 ]; then
		echo -en Also you can review your virtual hosts without this script! '\n'
	else 
		echo -en Unfortunately Apache is not present on this server. Your web daemon is called ${INVERSE}$software80${NORMAL} '\n' Please try to review your virtual hosts without this script! '\n'
		exit 0
	fi
}

#Set config path to find conf files
if [ -d '/etc/httpd/' ]; then
	cfpath='/etc/httpd/' #RHEL way
elif [ -d '/etc/apache2/' ]; then
	cfpath='/etc/apache2/' #Debian way
else 
	whereismywebserver #Jedi way
fi

#cat all configuration files, filter junk: commented lines, empty lines, etc
rawdata=$(find $cfpath -type f -name '*.conf' -exec cat {} \;| sed 's/^[ \t]*//' | grep -v ^[#] | awk 'NF')

#show column headings
echo -en ${INVERSE}'VHOST:PORT' 'DOMAIN' 'ALIASES' 'DIRECTORY' '\n' | column -t
echo -en ${NORMAL}

#parse prefiltered data
echo "$rawdata"| awk \
                '/^<VirtualHost*/,/^<\/VirtualHost>/\
                        {if\
                        (/^<\/VirtualHost>/)p=1;\
                        if\
                                        (/ServerName|VirtualHost|ServerAlias|DocumentRoot|## User/)out = \
                                                out (out?OFS:"") (/User/?$3:$2)}\
                                p{print out;p=0;out=""}' | 
sed -s 's/>//g' | column -t

#FIN!
emostar
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.