/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 コマンドは次のように言います。
で始まる行がある場合<仮想ホスト、以下を行います。
- 交換モード空間とホールド空間
- 次の入力行を読む
- その単語が含まれている場合サーバー名、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つだけです。
とにかく、助けてくれてありがとう。