我正在尝试创建一个 bash 脚本,该脚本可以生成一个文件,其中包含 Web 服务器托管的完整域列表(来自 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>
第二个条目。
<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
我认为你的做法是错误的。您应该使用 apache 自己的工具来执行此操作,而不是使用解析 VirtualHost 文件(顺便说一句,可以在任何地方)的 shell 脚本。其中之一是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
和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