fail2ban 감옥의 파일 이름을 일치 시키려고합니다. 따라서 파일 이름 globbing 만 사용해야합니다 .regexes 또는 bash 스크립팅은 아닙니다.
내 /var/log/apache2
디렉토리에는 다음을 포함한 파일이 포함되어 있습니다.
example.com.error.log
db.example.com.error.log
app1.example.com.error.log
app2.example.com.error.log
.error.log
제외하고 끝나는 모든 파일과 일치하는 glob를 만들려고합니다. db.example.error.log
가능합니까?
시도 !(db)*.error.log
했지만 여전히 일치 db.example.com.error.log
합니다. 나는 !()
문자가 일치하지 않는 것 같아서 *
파일 이름의 처음부터 일치 시킬 수 있습니다.
참고 : 새 appX
로그 파일이 추가 될 때 glob를 확장하고 싶지 않으므로 @()
현재 알려진 비 DB 파일 이름 목록과 함께 사용할 수 없습니다 .
(배경 : db.example.com을 제외한 모든 도메인에서 phpMyAdmin URL을 요청하는 사람을 금지하는 필터를 만들고 싶습니다)
답변
확장 된 파일 이름 글 로빙 패턴 ( 쉘 옵션이 활성화 된 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)
“like”처럼 동작 *
하지만 정확한 문자열과 일치하지 않으므로 db
패턴을 남길 **.error.log
수 있습니다 (첫 번째 *
는 “special”임).