bash розширені файли глобальної відповідності без префікса


13

Я намагаюся відповідати назви файлів для в'язниці fail2ban - тому мені потрібно використовувати лише глобальне ім'я файлів - а не регулярні вирази та баш сценарії.

Мій /var/log/apache2каталог містить файли, включаючи:

example.com.error.log
db.example.com.error.log
app1.example.com.error.log
app2.example.com.error.log

Я намагаюся створити глобус, щоб відповідати всім файлам, які закінчуються, за .error.log винятком db.example.error.log - чи це можливо?

Я намагався, !(db)*.error.logале це все одно відповідає db.example.com.error.log. Я здогадуюсь, що !()знак не відповідає жодним символам, що дозволяє *збігу з початку імені файлу.

Примітка: мені не хочеться розширювати глобус, коли appXдодаються нові логістичні файли, тому я не можу використовувати @()зі списком відомих на даний момент файлів не-db.

(Передумови: я хочу створити фільтр, який забороняє будь-кому запитувати будь-які URL-адреси phpMyAdmin у будь-якому домені, крім db.example.com)

Відповіді:


18

Розширений файл підстановка шаблон (підтримується bashз extglobопцією оболонки активується, а також ksh93)

!(db*).error.log

буде ігнорувати все, що починається з db.

Щоб бути більш конкретним:

!(db.example.com).error.log

Це ігнорує будь-яке ім’я в поточному каталозі, яке починається точно db.example.com.

!(db.example.com)Модель діє як «спеціальний *» , який не буде відповідати рядку db.example.com.


Ваш шаблон,

!(db)*.error.log

виключає будь-яке ім'я, яке починається з db, але дозволяє будь-який рядок після цього, який, очевидно, включає db.

За тією ж аналогією, що і вище, !(db)діє «як *», але не відповідає точній рядку db, залишаючи нас **.error.log так, як би мовити, (перший *- «особливий»).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.