Estou tentando combinar nomes de arquivos para uma prisão fail2ban - então preciso usar apenas globbing de nome de arquivo - não regexes ou script bash.
Meu /var/log/apache2
diretório contém arquivos, incluindo:
example.com.error.log
db.example.com.error.log
app1.example.com.error.log
app2.example.com.error.log
Estou tentando criar um glob para corresponder a todos os arquivos que terminam em, .error.log
exceto db.example.error.log
- isso é possível?
Eu tentei, !(db)*.error.log
mas isso ainda corresponde db.example.com.error.log
. Suponho !()
que não corresponda a nenhum caractere, permitindo *
que corresponda desde o início do nome do arquivo.
Observação: não quero ter que estender o glob quando novos appX
arquivos de log forem adicionados, então não posso usar @()
com a lista de nomes de arquivos não-db atualmente conhecidos.
(Antecedentes: desejo criar um filtro banindo qualquer pessoa que solicite qualquer URL do phpMyAdmin em qualquer domínio, exceto db.example.com)
O padrão de globbing de nome de arquivo estendido (suportado por
bash
com aextglob
opção de shell ativada e também porksh93
)irá ignorar qualquer coisa que comece com
db
.Para ser mais específico:
Isso irá ignorar qualquer nome no diretório atual que comece exatamente com
db.example.com
.O
!(db.example.com)
padrão age como um "especial*
" que não corresponderá à stringdb.example.com
.seu padrão,
exclui qualquer nome que comece com
db
, mas permite qualquer string depois disso, o que obviamente incluidb
.Pela mesma analogia acima,
!(db)
age "como*
" mas não corresponderá à string exatadb
, deixando-nos com o padrão**.error.log
, por assim dizer (com o primeiro*
sendo "especial").