이름을 기준으로 가상 호스트를 단일 파일로 추출합니다.

이름을 기준으로 가상 호스트를 단일 파일로 추출합니다.

/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 명령은 다음과 같이 말합니다.

로 시작하는 줄이 있는 경우<가상호스트, 다음을 수행하십시오:

  1. 교환 모드 공간과 홀드 공간
  2. 다음 입력 줄 읽기
  3. 해당 단어가 포함된 경우서버 이름, ServerName 값이 지정된 스크립트의 매개변수 2와 같은지 확인하세요.
  4. 동일하지 않은 경우 패턴 공간의 모든 항목을 삭제하고 패턴과 홀드 공간을 교환한 후 패턴 공간을 삭제하고 다음 입력 라인에서 sed 명령을 시작합니다.
  5. 동일한 경우 입력 줄에 닫는 태그가 포함되어 있는지 확인하세요.</가상호스트
  6. 그렇다면 예약된 공간에 개행 문자를 추가하고, 예약된 공간에 패턴 공간을 추가하고, 패턴과 예약된 공간을 바꾸고, 내용을 인쇄하고 종료합니다.
  7. 그렇지 않으면, 예약된 공간에 개행 문자를 추가하고 예약된 공간에 패턴 공간의 내용을 추가하고 레이블 루프로 점프합니다(위의 2단계).

답변2

기본적으로 파일을 각각 분할한 <VirtualHost다음 ServerName값에 따라 이름을 바꾸려고 합니다.

1단계: 파일 분할

csplit -z -f vhost_ '/<VirtualHost/' '{*}'

csplit지정된 패턴 일치에서 파일 분할을 허용합니다. <VirtualHost여기에 포함된 옵션은 다음과 같습니다. 이 접두사를 사용하여 결과 파일의 이름을 지정합니다(새 파일은 , , .... -f vhost_가 됩니다 ). 빈 파일을 만들지 않고 각 패턴 일치에서 분할합니다. 더 많은 콘텐츠는 다음에서 확인하실 수 있습니다.vhost_00vhost_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개뿐입니다.

어쨌든, 도와주셔서 정말 감사드립니다.

관련 정보