Erstellen einer Domänenliste mit httpd.conf

Erstellen einer Domänenliste mit httpd.conf

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::Generalkann 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 sedund können Sie die Domäne aus Zeilen in mehrere Zeilen mit einer Domäne pro Zeile awkextrahieren.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

verwandte Informationen