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

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

/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)。

おすすめ記事