Le risposte finora funzioneranno, tranne se avete server_name
direttive in esecuzione su più righe, allora sarà fallire in modo silenzioso. Sembrano anche scritti per il consumo umano (raccogliendo righe extra come server_name_in_redirect off;
) in modo da non poterli includere in uno script.
Ho un sacco di host virtuali, e voleva utilizzare l'uscita in uno script (sigh), quindi ecco qualcosa che è molto più a lungo, ma dovrebbe essere abbastanza robusto per questo scopo:
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
Poiché è lungo e \
-y, includerò una rapida spiegazione di ogni riga.
- Get nginx per stampare tutta la sua configurazione (in modo che non ci si deve preoccupare i file da includere) e sanificare esso: rimuovere iniziali e finali spazio, commenti (compresi quelli finali) e righe vuote.
- Ogni riga che non termina con un punto e virgola o parentesi graffa deve essere continuata, quindi sostituiamo qualsiasi
\n
senza un precedente ;
, {
o }
con uno spazio.Questo ha bisogno di usare lo strambo di sed :a;N;$!ba;
afferrare l'intero trucco di file, e qualche raggruppamento in modo che possiamo rimettere l'ultimo carattere con \1
, oltre a un sacco di backslash extra per fortuna.
- Ora siamo in grado di estrarre ciascuna riga
server_name
, con alcuni controlli aggiuntivi per rimuovere le variabili nginx ($foo
) e includere solo domini validi (ovvero non localhost
e _
).
- Qualsiasi tabulazione/spazio tra le parole viene trasformata in ritorni a capo, quindi rimuoviamo gli spazi in eccesso (per ogni evenienza), i punti e virgola e la parte
server_name
.
- Infine ordinalo, uniqify e usa
xargs -L1
per rimuovere la singola riga vuota nella parte superiore.
noti che ci sono alcuni bit in qui che sono tecnicamente raddoppio, ma mi piace essere il più chiaro e robusto possibile. Suggerimenti per il miglioramento benvenuto, però.
fonte
2017-09-15 02:36:35
Dipende da ciò che si chiama 'vhost'. Il blocco del server di Nginx potrebbe corrispondere a qualsiasi numero di domini. Forse vuoi elencare tutti i blocchi del server? –
Sì, i blocchi del server funzionerebbero. Probabilmente quelli per la porta 80. Il punto è elencare tutti i siti Web per generare la fatturazione per l'hosting. – Corgalore