Ich versuche, ein Bash-Skript zu erstellen, das eine Datei generieren kann, die eine vollständige Liste der von einem Webserver gehosteten Domänen (aus der Konfigurationsdatei von Apache) enthält.
Eigentlich scheint es ganz einfach zu sein. So wie ich das sehe, sind ServerName und ServerAlias die wichtigsten Anweisungen, die zum Generieren dieser Liste erforderlich sind.
Was mich verwirrt, ist die Möglichkeit, mehrere Aliase zu haben.
Ein Beispieleintrag.
<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>
Ein zweiter Eintrag.
<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>
Was wäre der beste Ansatz in Bash, um diese Liste zu generieren?
Antwort1
Ich denke, Sie gehen das falsch an. Statt eines Shell-Skripts, das die Dateien von VirtualHost analysiert (die übrigens überall sein können), sollten Sie hierfür Apache-eigene Tools verwenden. Eines davon istapache2ctl status
.
Antwort2
Das Perl-ModulConfig::General
kann Apache-Conf-Dateien analysieren, also könnten Sie
#!/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";
}
}
}
Antwort3
Dieser Code ist etwas hässlich. Durch die Kombination von sed
und können Sie die Domäne aus Zeilen in mehrere Zeilen mit einer Domäne pro Zeile awk
extrahieren.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