웹 서버에서 호스팅하는 전체 도메인 목록이 포함된 파일을 생성하는 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>
두 번째 항목.
<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
펄 모듈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