Die Antworten so weit wird funktionieren, außer wenn Sie server_name
Richtlinien haben mehrere Linien laufen über, dann wird es still scheitern. Sie scheinen auch für den menschlichen Verzehr geschrieben zu sein (nehmen Sie zusätzliche Zeilen wie server_name_in_redirect off;
auf), so dass Sie sie nicht in ein Skript aufnehmen können.
ich viele virtuelle Hosts haben, und wollte die Ausgabe in einem Skript verwenden ( seufzen), also hier ist etwas, was viel länger ist, sollte aber dafür robust genug sein:
nginx -T | sed -r -e 's/[ \t]*$//' -e 's/^[ \t]*//' -e 's/^#.*$//' -e 's/[ \t]*#.*$//' -e '/^$/d' | \
sed -e ':a;N;$!ba;s/\([^;\{\}]\)\n/\1 /g' | \
grep -P 'server_name[ \t]' | grep -v '\$' | grep '\.' | \
sed -r -e 's/(\S)[ \t]+(\S)/\1\n\2/g' -e 's/[\t ]//g' -e 's/;//' -e 's/server_name//' | \
sort | uniq | xargs -L1
Da es lang ist und \
-y, werde ich eine kurze Erklärung jeder Zeile enthalten.
- Erhalten nginx seine gesamte Konfiguration drucken (so dass wir uns keine Sorgen über die Include-Dateien) und sanieren sie: entfernen vorderen und hinteren Raum, Kommentare (einschließlich Hinter sind) und Leerzeilen.
- Jede Zeile, die fortgesetzt werden, nicht mit einem Semikolon oder eine geschweifte Klammer enden sollte, so ersetzen wir jede
\n
ohne ein vorhergehendes ;
, {
oder }
mit einem Leerzeichen.Dies muss sed's Weirdo :a;N;$!ba;
greifen die ganze Datei Trick, und einige Gruppierung, so dass wir das letzte Zeichen zurück mit \1
, plus ein paar zusätzliche Backslashes für Glück setzen können.
- Jetzt können wir jede Zeile
server_name
ziehen, mit einigen zusätzlichen Prüfungen, um nginx Variablen ($foo
) zu entfernen und nur gültige Domänen (dh nicht localhost
und _
).
- Alle Registerkarten/Leerzeichen zwischen Wörtern werden in Wagenrücklauf umgewandelt, dann entfernen wir überschüssige Leerzeichen (nur für den Fall), Semikolons und den
server_name
Teil.
- Schließlich sortieren, uniqify es und
xargs -L1
verwenden, um die einzelne leere Zeile an der Spitze zu entfernen.
Hinweis, dass es einige Bits hier in der technisch verdoppeln sind, aber Ich mag so klar und robust wie möglich sein. Verbesserungsvorschläge sind jedoch willkommen.
Das hängt davon ab, was Sie 'vhost' nennen. Der Serverblock von Nginx könnte mit einer beliebigen Anzahl von Domänen übereinstimmen. Vielleicht möchten Sie alle Serverblöcke auflisten? –
Ja, Serverblöcke funktionieren. Wahrscheinlich diejenigen für Port 80. Der Punkt ist, alle Websites aufzulisten, um die Abrechnung für das Hosting zu generieren. – Corgalore