名前に基づいて仮想ホストを単一のファイルに抽出します。

名前に基づいて仮想ホストを単一のファイルに抽出します。

/etc/apache2/sites-enabled/default-ssl.confから各VirtualHostを抽出して独自の設定ファイルに保存したいと思います。

1つのファイルに項目が多すぎるため、これを管理することがますます問題になっていますが、各仮想ホストごとに別々のファイルに移動すると、作業と管理が簡単になります。

<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つだけです。

とにかく、助けてくれてありがとう。

関連情報