Im Grunde kann man sich die ganze Schreiberei doch sparen ...
Denn die Variablen sollen ja genau so heißen und zugewiesen werden, wie sie in der Konfigurationsdatei stehen.
→ Also bräuchte man sie doch nur zu Bash-Variablenzuweisungen umformatieren und dann mit source
ausführen ...?
Sicherheitsprobleme (das wäre hier ein Angelpunkt !) würde ich hier auch nicht erwarten, solange kein Code von außen zugeführt wird.
Konkret vereinfacht sich der awk
-Teil damit auf einen Dreizeiler:
track@track:~$ echo '<VirtualHost 172.20.30.40:80>
DocumentRoot /www/domain-80
SSLCertificateFile /etc/ssl/certs/dddd
SSLCertificateKeyFile /etc/ssl/private/dddd
SSLCertificateChainFile /etc/ssl/certs/ddd
ServerName sub2.example.com
</VirtualHost>
<VirtualHost 172.20.30.40:80>
DocumentRoot /www/domain-80
SSLCertificateFile /etc/ssl/certs/eeee
SSLCertificateKeyFile /etc/ssl/private/eeee
SSLCertificateChainFile /etc/ssl/certs/eee
ServerName www.example.com
</VirtualHost>' | awk -v name="www.example.com" '
/SSLCert/ {text= text $1 "=\"" $2 "\"\n"}
/ServerName/ {server=$2}
/<\/VirtualHost>/ {if(server==name) printf "%s",text; text=""}'
SSLCertificateFile="/etc/ssl/certs/eeee"
SSLCertificateKeyFile="/etc/ssl/private/eeee"
SSLCertificateChainFile="/etc/ssl/certs/eee"
Das wären ja schon mal die gewünschten Variablenzuweisungen für die Shell.
Nun wäre das ganze noch zu source
n, dann hätten wir es:
track@track:~$ . <( awk -v name="www.example.com" '
/SSLCert/ {text= text $1 "=\"" $2 "\"\n"}
/ServerName/ {server=$2}
/<\/VirtualHost>/ {if(server==name) printf "%s",text; text=""}' "vhost2.conf" )
track@track:~$ # testen wir die Variablen:
track@track:~$ for v in "${!SSLCert@}"; do echo "$v enthält: ${!v}"; done
SSLCertificateChainFile enthält: /etc/ssl/certs/eee
SSLCertificateFile enthält: /etc/ssl/certs/eeee
SSLCertificateKeyFile enthält: /etc/ssl/private/eeee
(An dieser Stelle werden Servername und Dateiname eingekoppelt, gerne auch durch Shell-Variablen)
Soweit mal die Variante per source
... (die eigentlich ganz übersichtlich ist)
LG,
track