Webサーバーでホストされているドメイン全体のリストを含むファイルを生成するbashスクリプトを生成しようとしています(Apacheの設定ファイルから)。
実際には簡単に見えます。私が知る限り、ServerNameとServerAliasはこのリストを生成するために必要なコアディレクティブです。
私を混乱させることは、いくつかのエイリアスがあるかもしれません。
例示項目です。
<VirtualHost IP_ADDR:PORT>
ServerName domain-1.tld
ServerAlias www.domain-1.tld
DocumentRoot /home/domain-1.tld/public_html
ServerAdmin [email protected]
UseCanonicalName Off
CustomLog /usr/local/apache/domlogs/domain-1.tld combined
CustomLog /usr/local/apache/domlogs/domain-1.tld-bytes_log "%{%s}t %I .\n%{%s}t %O ."
</VirtualHost>
2番目の項目。
<VirtualHost IP_ADDR:PORT>
ServerName domain-2.tld
ServerAlias www.domain-2.tld some-other-domain.tld another-domain.tld
DocumentRoot /home/domain-2.tld/public_html
ServerAdmin [email protected]
UseCanonicalName Off
CustomLog /usr/local/apache/domlogs/domain-2.tld combined
CustomLog /usr/local/apache/domlogs/domain-2.tld-bytes_log "%{%s}t %I .\n%{%s}t %O ."
</VirtualHost>
Bashでこのリストを生成する最良の方法は何ですか?
答え1
私の考えでは、あなたがやっていることが間違っていると思います。これを行うには、VirtualHostファイルを解析するシェルスクリプト(どこにいてもかまいません)を使用する代わりに、Apache独自のツールを使用する必要があります。その一つはapache2ctl status
。
答え2
PerlモジュールConfig::General
Apache confファイルを解析できるので、次のことができます。
#!/usr/bin/perl
use strict;
use warnings;
use Config::General;
my %conf = Config::General->new('/path/to/config.conf')->getall();
for my $ip_port (keys %{$conf{VirtualHost}}) {
for my $vh (@{$conf{VirtualHost}{$ip_port}}) {
if (exists $vh->{ServerName} and exists $vh->{ServerAlias}) {
my $aliases = ref $vh->{ServerAlias} eq 'ARRAY'
? join(",", @{$vh->{ServerAlias}})
: $vh->{ServerAlias};
print $ip_port, "\t", $vh->{ServerName}, "\t", $aliases, "\n";
}
}
}
答え3
このコードはちょっと見苦しいです。合計を結合すると、sed
行のフィールドを行ごとに1つのフィールドに複数の行に抽出awk
できます。ServerAlias
# echo ' ServerAlias www.domain-2.tld some-other-domain.tld another-domain.tld' | awk '{print substr($0, index($0, $2))}' | sed -e 's/\s\+/\n/g'
www.domain-2.tld
some-other-domain.tld
another-domain.tld