나는 Fail2ban 감옥의 파일 이름을 일치시키려고 노력 중입니다. 따라서 정규식이나 bash 스크립트가 아닌 파일 이름 globbing을 사용해야 합니다.
내 /var/log/apache2
디렉터리에는 다음을 포함한 파일이 포함되어 있습니다.
example.com.error.log
db.example.com.error.log
app1.example.com.error.log
app2.example.com.error.log
다음으로 끝나는 모든 파일과 일치하는 glob을 만들려고 합니다..error.log
와는 별개로 db.example.error.log
- 가능합니까?
나는 그것을 시도했지만 !(db)*.error.log
이것은 여전히 와 일치합니다 db.example.com.error.log
. 파일 이름의 시작 부분부터 일치를 !()
허용하는 문자가 일치하지 않는 것 같습니다 .*
참고: 새 로그 파일을 추가할 때 glob을 확장하고 싶지 않으므로 현재 알려진 데이터베이스가 아닌 파일 이름 목록을 appX
사용할 수 없습니다 .@()
(배경: 모든 도메인의 phpMyAdmin URL을 요청하는 것을 금지하는 필터를 만들고 싶습니다.와는 별개로db.example.com)
답변1
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" 동작은 *
정확한 string 과 일치하지 않으므로 db
패턴이 남습니다.**.error.log
당신은 그렇게 말할 수 있습니다(첫 번째는 *
"특별"입니다).