/etc/apache2/sites-enabled/default-ssl.conf에서 각 VirtualHost를 추출하여 자체 구성 파일에 저장하고 싶습니다.
하나의 파일에 항목이 너무 많아 이를 관리하는 것이 점점 문제가 되고 있지만 각 가상 호스트에 대해 별도의 파일로 이동하면 작업 및 관리가 쉽습니다.
<VirtualHost *:443>
ServerAdmin [email protected]
ServerName www.customer1.com
ServerAlias customer1.com
DocumentRoot /var/www/customer1
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/ssl_access.log combined
SSLEngine on
SSLProtocol all
SSLCipherSuite HIGH:MEDIUM
SSLStrictSNIVHostCheck on
SSLVerifyClient none
SSLProxyEngine off
SSLCertificateFile /etc/apache2/ssl_certs/customer1.cert
SSLCertificateKeyFile /etc/apache2/ssl_certs/customer1.key
SSLCertificateChainFile /etc/apache2/ssl_certs/customer1.inter.cert
<Directory /var/www/customer1>
Options -Indexes
AllowOverride All
</Directory>
비슷한 것을 시도 중이지만 ServerName 값을 기반으로 격리할 수 없습니다.
awk '/^<VirtualHost/{flag=1}/^<\/VirtualHost/{print $2;flag=0}flag' /etc/apache2/sites-enabled/default-ssl.conf
답변1
다음 입력이 포함된 file.txt라는 파일이 제공됩니다.
<VirtualHost *:443>
ServerAdmin [email protected]
ServerName name1
</VirtualHost>
<VirtualHost *:443>
ServerAdmin [email protected]
ServerName name2
</VirtualHost>
<VirtualHost *:443>
ServerAdmin [email protected]
ServerName name3
</VirtualHost>
<VirtualHost *:443>
ServerAdmin [email protected]
ServerName name4
</VirtualHost>
내용이 다음과 같은 get-virtual-host.sh라는 스크립트입니다.
#!/bin/bash
if [ $# -ne 2 ]; then
echo "Usage: get-virtual-host.sh <filename> <ServerName>"
exit 1
fi
sed -ne "/^<VirtualHost/{x;:cycle n; /ServerName/{/ServerName[[:space:]]\+$2/!{s/.*//; x; d}}; /<\/VirtualHost/{H;x;p;q}; H; bcycle}" $1
그런 다음 다음과 같은 매개변수를 지정하여 VirtualHost 부분을 가져올 수 있습니다.
get-virtual-host.sh file.txt name2
어느 출력
<VirtualHost *:443>
ServerAdmin [email protected]
ServerName name2
</VirtualHost>
이것이 당신에게 필요한 것입니까?
Sed 스크립트는 필요에 따라 다음을 설명합니다.
sed 명령은 다음과 같이 말합니다.
로 시작하는 줄이 있는 경우<가상호스트, 다음을 수행하십시오:
- 교환 모드 공간과 홀드 공간
- 다음 입력 줄 읽기
- 해당 단어가 포함된 경우서버 이름, ServerName 값이 지정된 스크립트의 매개변수 2와 같은지 확인하세요.
- 동일하지 않은 경우 패턴 공간의 모든 항목을 삭제하고 패턴과 홀드 공간을 교환한 후 패턴 공간을 삭제하고 다음 입력 라인에서 sed 명령을 시작합니다.
- 동일한 경우 입력 줄에 닫는 태그가 포함되어 있는지 확인하세요.</가상호스트
- 그렇다면 예약된 공간에 개행 문자를 추가하고, 예약된 공간에 패턴 공간을 추가하고, 패턴과 예약된 공간을 바꾸고, 내용을 인쇄하고 종료합니다.
- 그렇지 않으면, 예약된 공간에 개행 문자를 추가하고 예약된 공간에 패턴 공간의 내용을 추가하고 레이블 루프로 점프합니다(위의 2단계).
답변2
기본적으로 파일을 각각 분할한 <VirtualHost
다음 ServerName
값에 따라 이름을 바꾸려고 합니다.
1단계: 파일 분할
csplit -z -f vhost_ '/<VirtualHost/' '{*}'
csplit
지정된 패턴 일치에서 파일 분할을 허용합니다. <VirtualHost
여기에 포함된 옵션은 다음과 같습니다. 이 접두사를 사용하여 결과 파일의 이름을 지정합니다(새 파일은 , , .... -f vhost_
가 됩니다 ). 빈 파일을 만들지 않고 각 패턴 일치에서 분할합니다. 더 많은 콘텐츠는 다음에서 확인하실 수 있습니다.vhost_00
vhost_01
-z
{*}
man csplit
2단계: 파일 이름 바꾸기
간단한 bash 루틴을 사용하면 됩니다.
for f in vhost_??
do mv $f $(grep ServerName $f | awk '{print $2".conf"}')
done
잘 아시는 것 같으니 awk
설명 bash
은 생략하겠습니다.
답변3
@Juxtaposed - 저는 당신이 unix.com 그룹에 속해 있다는 것을 알고 있습니다. 당신은 이러한 분야의 전문가입니다.
이 솔루션은 나에게 완벽하게 작동합니다.
egrep -v "^$|^#" default-ssl.conf|egrep ServerName |while read S N
do
./get-virtual-host.sh default-ssl.conf $N > configs/$N.conf
done
일부 파일은 비어 있지만 그래도 괜찮습니다. 전체 가상 호스트임에도 불구하고 크기가 0인 파일은 2개뿐입니다.
어쨌든, 도와주셔서 정말 감사드립니다.