哪些 Regex 语法用于指定 clamscan 的包含/排除

哪些 Regex 语法用于指定 clamscan 的包含/排除

我刚刚安装蛤蜊在我的Linux系统上。

我打算从根目录(/) 手动扫描整个系统。但我知道有些目录应该跳过(例如/proc,,)。/sys/dev

clamscan 在线文档仅提供选项的简要列表。clamscan --help提供了更多信息,但它仅说:

--exclude=REGEX                      Don't scan file names matching REGEX
--exclude-dir=REGEX                  Don't scan directories matching REGEX
--include=REGEX                      Only scan file names matching REGEX
--include-dir=REGEX                  Only scan directories matching REGEX

我哪儿也找不到关于要使用的具体 REGEX 语法的任何描述。

我特别想知道我是否应该使用grep 基本或扩展正则表达式语法或者可能是其他方言。

我还发现了一篇帖子,其中有人使用它--exclude来排除目录,--exclude-dir并想知道这是否可行。

答案1

我做了一些实验并发现你应该使用扩展的正则表达式语法。

因此,字符 '?'、'+'、'{'、'|'、'(' 和 ')' 具有其特殊含义,必须用 '' 转义才能按字面意思理解。

使用时--exclude,任何匹配(任何地方)的文件都不会被扫描。因此,如果正则表达式与文件所在的目录匹配,则不会扫描该文件。但会检查其是否匹配。如果--exclude-dir使用目录匹配则不会扫描其任何内容,或检查匹配项。

这可以在日志中看到(如果指定了--log),其中有一个条目表示目录被排除,而另一个条目表示该目录中的每个文件都被排除。

这是我为自己创建的 bash 脚本,它构建了几个--exclude-dir选项来排除根目录和子目录。我确信它可以改进,但我希望它能证明正则表达式和我认为运行扫描所需的各种选项的一个有用示例。

#! /usr/bin/env bash

# bool function to test if the user is root or not
is_user_root () { [ "${EUID:-$(id -u)}" -eq 0 ]; }

is_user_root || {
    echo 'You are just an ordinary user. Run as root.' >&2
    exit 1
}

LOG_FILE=/var/log/clamscan.log
EXCLUDE_ROOT_DIRS=(proc sys dev media mnt data/Downloads)
EXCLUDE_SUBDIRS=('lost\+found' .git)

declare -a EXCLUDE_DIRS
if [[ ${#EXCLUDE_ROOT_DIRS[@]} -ne 0 ]]; then
    ED_RE="^/("; for xrd in ${EXCLUDE_ROOT_DIRS[@]}; do ED_RE+="$xrd|"; done; ED_RE="${ED_RE%|})"
    EXCLUDE_DIRS+=("--exclude-dir=$ED_RE")
    #EXCLUDE_DIRS+="--exclude-dir=^/("; for xrd in ${EXCLUDE_ROOT_DIRS[@]}; do EXCLUDE_DIRS+="$xrd|"; done; EXCLUDE_DIRS="${EXCLUDE_DIRS%|})"; echo $EXCLUDE_DIRS
fi
if [[ ${#EXCLUDE_SUBDIRS[@]} -ne 0 ]]; then
    ED_RE="/("; for xsd in ${EXCLUDE_SUBDIRS[@]}; do ED_RE+="$xsd|"; done; ED_RE="${ED_RE%|})"
    EXCLUDE_DIRS+=("--exclude-dir=$ED_RE")
    #EXCLUDE_DIRS+=" --exclude-dir=/("; for xsd in ${EXCLUDE_SUBDIRS[@]}; do EXCLUDE_DIRS+="$xsd|"; done; EXCLUDE_DIRS="${EXCLUDE_DIRS%|})"; echo $EXCLUDE_DIRS
fi

# Adding --verbose will write Scanning messages to stdout e.g.
# Scanning /data/Games/henry/Steam/ubuntu12_32/steam-runtime/usr/share/doc/libglib2.0-0/README.gz
echo clamscan --suppress-ok-results --log=$LOG_FILE --max-filesize=100M --recursive ${EXCLUDE_DIRS[@]} /
clamscan --suppress-ok-results --log=$LOG_FILE --max-filesize=100M --recursive ${EXCLUDE_DIRS[@]} /

# NOTE: may want to edit the log file and remove the reports on Symbolic links and Empty files
# sed -i -E -e '/: (Symbolic link|Empty file)$/d' $LOG_FILE
echo 'List of any FOUND infected files'
grep FOUND$ /var/log/clamav.log

上述脚本执行的命令行是:

clamscan --suppress-ok-results --log=/var/log/clamscan.log --max-filesize=100M --recursive --exclude-dir=^/(proc|sys|dev|media|mnt|data/Downloads) --exclude-dir=/(lost\+found|.git) /

相关内容