A row-by-row comparison of ClamAV’s command-line surface against exav’s, to check
a command line before swapping a binary. The rest of the migration (signatures,
sockets, service units) is in Migrating from ClamAV,
and exav’s own flags are in the CLI reference.
One binary plays all three parts, and the flags pick which, so the rows below
apply to a command line that already starts with exav:
| ClamAV binary |
exav invocation |
Selected by |
clamscan |
exav PATH… |
paths, neither --listen nor --connect |
clamd |
exav --listen ADDR |
--listen |
clamdscan |
exav --connect ADDR PATH… |
--connect and paths |
exav does not dispatch on the name it was invoked under, so an existing
clamscan / clamdscan command line gets there through a wrapper script (see
One binary, three roles).
| Status |
Meaning |
| same |
exav accepts the same spelling and does the same thing. |
| renamed |
exav has the capability under a different name. The exav column gives it. |
| differs |
Accepted, behaviour deliberately different. The Notes column says how. |
| absent |
Not accepted. exav exits 2 with a parse error naming the flag. |
exav’s flags are its own, and an unsupported flag stops the run at startup
instead of being swallowed, so a migration finds these on the first run. There
are no hidden aliases: a renamed row means the old spelling is refused and
the error names exav’s.
clamscan spells most switches --flag[=yes/no]. exav’s switches are bare:
--all-matches is accepted, --all-matches=yes is not. Drop the value when
translating; a switch is on when given and off when omitted. Settings that are on
by default come as a pair of lists instead (--decode / --no-decode), so an
explicit choice can beat the --clamav-compat preset either way.
Grouped in the order clamscan --help prints them.
clamscan |
What it does |
exav |
Status |
Notes |
--help, -h |
Show help |
same spelling |
same |
|
--version, -V |
Print version |
same spelling |
differs |
Prints exav <version>, naming what is actually running. The ClamAV <version> string tooling looks for is what the daemon answers to the wire VERSION command, so clamdtop and clamd client libraries see the engine they expect; a script grepping clamscan --version for ClamAV does not. |
--verbose, -v |
Be verbose |
same spelling |
differs |
exav prints per-file informational findings (the detected type, and with --detect exav-heuristics the imphash, entropy and static score) rather than progress chatter. |
--archive-verbose, -a |
Show filenames inside archives |
none |
absent |
Member paths appear in the match location on a detection. |
--debug |
libclamav debug messages |
none |
absent |
|
--quiet |
Only output error messages |
--quiet |
differs |
exav still prints detection lines under --quiet; clamscan suppresses them too. exav’s --quiet is the whole output dial: it drops the per-file OK lines and the summary. |
--stdout |
Write to stdout instead of stderr |
none |
absent |
exav already writes OK, FOUND and PARTIAL lines to stdout, and only ERROR lines and diagnostics to stderr. |
--no-summary |
No summary at end |
--quiet |
renamed |
--quiet suppresses the OK lines and the summary together. |
--infected, -i |
Only print infected files |
--quiet |
renamed |
Same setting. |
--suppress-ok-results, -o |
Skip printing OK files |
--quiet |
renamed |
Same setting. |
--bell |
Sound bell on detection |
same spelling |
same |
|
clamscan |
What it does |
exav |
Status |
Notes |
--tempdir=DIR |
Create temporary files in DIR |
--spill-dir |
renamed |
exav’s temporary files follow TMPDIR unless --spill-dir names somewhere else; --spill-dir off writes none at all. |
--leave-temps[=yes/no] |
Keep temporary files |
none |
absent |
|
--force-to-disk[=yes/no] |
Spill nested scans to disk |
none |
absent |
A member that decodes past --max-object-bytes goes to a spill file, as a streamed object (INSTREAM, stdin, an ICAP body) does past --spill-threshold-bytes; both are deleted when the scan ends. --spill-dir says where, or off for never. |
--gen-json[=yes/no] |
JSON scan metadata (testing) |
none |
absent |
exav’s --json is a different thing: newline-delimited scan results, not engine metadata. |
clamscan |
What it does |
exav |
Status |
Notes |
--database=FILE/DIR, -d |
Load database from FILE or DIR |
same spelling |
same |
Also loads a prebuilt .exavdb, named as a file. Replaces --sig-dir, the default directory, and is what --auto-update writes to when given. |
--official-db-only[=yes/no] |
Only load official signatures |
none |
absent |
|
--fail-if-cvd-older-than=days |
Nonzero exit if database is stale |
none |
absent |
|
--log=FILE, -l |
Save scan report to FILE |
--log |
differs |
The long spelling matches; -l is absent. clamscan logs detections, warnings and the summary; exav logs every result line, OK included, and every error, but not the summary. |
clamscan |
What it does |
exav |
Status |
Notes |
--recursive[=yes/no], -r |
Scan subdirectories recursively |
(the default) |
absent |
Refused with a hint: exav recurses into a named directory with no flag; --no-recursive is the opt-out. |
--allmatch[=yes/no], -z |
Keep scanning after a match |
--all-matches |
renamed |
-z is absent. |
--cross-fs[=yes/no] |
Scan across filesystems |
none |
absent |
exav’s walk descends across mount points, matching clamscan’s default; the =no setting has no equivalent. |
--follow-dir-symlinks[=0/1/2] |
Follow directory symlinks |
none |
absent |
exav follows a symlink named directly on the command line and does not descend into one found inside a tree, clamscan’s default (1). Modes 0 and 2 have no equivalent. |
--follow-file-symlinks[=0/1/2] |
Follow file symlinks |
none |
absent |
Same default behaviour, same lack of a knob. A symlink found inside a directory is skipped by both; clamscan prints a <path>: Symbolic link line for it and exav passes over it in silence. |
--file-list=FILE, -f |
Scan files listed in FILE |
--files-from |
renamed |
The spelling tar and rsync use for the same idea. exav also skips blank lines and # comments, and merges the list with paths on the command line. -f is absent. |
--exclude=REGEX |
Skip file names matching REGEX |
same spelling |
same |
Unanchored match against the whole path in both. Repeatable in exav. |
--exclude-dir=REGEX |
Skip directories matching REGEX |
same spelling |
same |
Repeatable in exav; the directory is pruned before descent. |
--include=REGEX |
Only scan names matching REGEX |
same spelling |
same |
Repeatable in exav. |
--include-dir=REGEX |
Only scan directories matching REGEX |
none |
absent |
|
clamscan |
What it does |
exav |
Status |
Notes |
--remove[=yes/no] |
Delete infected files |
none |
absent |
Out of scope by design: exav reports, your script acts. Read the exit code. |
--move=DIRECTORY |
Move infected files |
none |
absent |
Same. |
--copy=DIRECTORY |
Copy infected files |
none |
absent |
Same. |
clamscan |
What it does |
exav |
Status |
Notes |
--bytecode[=yes/no] |
Load bytecode from the database |
none |
absent |
exav always loads and runs .cbc programs; there is no switch to disable them. |
--bytecode-unsigned[=yes/no] |
Load unsigned bytecode |
none |
absent |
exav performs no bytecode signature check, so its behaviour is clamscan --bytecode-unsigned=yes with no way to tighten it. See the gaps below. |
--bytecode-timeout=N |
Bytecode timeout (ms) |
none |
absent |
|
--statistics[=none/bytecode/pcre] |
Print execution statistics |
--profile |
renamed |
A different measurement: a per-matcher timing breakdown. Scanning files it is a CSV row per file; on a listener the same numbers come back through STATS as MATCHERSTATS. One flag, because which of those happens is a property of what exav was asked to do. |
--detect-pua[=yes/no] |
Detect Possibly Unwanted Applications |
--detect pua |
renamed |
Loads .??u databases and keeps PUA.* names. Off by default in both. |
--exclude-pua=CAT |
Skip PUA signatures of category CAT |
none |
absent |
PUA is all-or-nothing in exav. |
--include-pua=CAT |
Load PUA signatures of category CAT |
none |
absent |
Same. |
clamscan |
What it does |
exav |
Status |
Notes |
--detect-structured[=yes/no] |
Detect SSNs / credit-card numbers |
none |
absent |
exav turns the heuristic on by giving it a threshold: set --dlp-credit-cards or --dlp-ssns. |
--structured-ssn-format=X |
SSN format (normal / stripped / both) |
none |
absent |
|
--structured-ssn-count=N |
Minimum SSN count to alert |
--dlp-ssns |
renamed |
Needs a build with the dlp feature (on by default). Named --dlp- rather than --detect because what it finds is the organisation’s own data on its way somewhere, not malware. |
--structured-cc-count=N |
Minimum credit-card count to alert |
--dlp-credit-cards |
renamed |
Same feature note. |
--structured-cc-mode=X |
Credit-card mode |
none |
absent |
|
clamscan can switch any single parser off. exav has no equivalent: every parser
it implements is always on.
clamscan |
What it does |
exav |
Status |
--scan-mail[=yes/no] |
Scan mail files |
none |
absent |
--phishing-sigs[=yes/no] |
Signature-based phishing detection |
none |
absent |
--phishing-scan-urls[=yes/no] |
URL signature phishing detection |
none |
absent |
--heuristic-alerts[=yes/no] |
Heuristic alerts |
none |
absent |
--heuristic-scan-precedence[=yes/no] |
Stop at the first heuristic match |
none |
absent |
--normalize[=yes/no] |
Normalize HTML, script and text |
none |
absent |
--scan-pe[=yes/no] |
Scan PE files |
none |
absent |
--scan-elf[=yes/no] |
Scan ELF files |
none |
absent |
--scan-ole2[=yes/no] |
Scan OLE2 containers |
none |
absent |
--scan-pdf[=yes/no] |
Scan PDF files |
none |
absent |
--scan-swf[=yes/no] |
Scan SWF files |
none |
absent |
--scan-html[=yes/no] |
Scan HTML files |
none |
absent |
--scan-xmldocs[=yes/no] |
Scan XML-based documents |
none |
absent |
--scan-hwp3[=yes/no] |
Scan HWP3 files |
none |
absent |
--scan-onenote[=yes/no] |
Scan OneNote files |
none |
absent |
--scan-archive[=yes/no] |
Scan archives |
none |
absent |
--scan-image[=yes/no] |
Scan graphics files |
none |
absent |
--scan-image-fuzzy-hash[=yes/no] |
Image fuzzy hashing |
none |
absent |
A configuration that switched a parser off would change meaning under exav, so
these flags are refused and the change is visible.
ClamAV has a boolean per condition. exav has two settings: --detect says what
to look for, and --partial-as says what becomes of an object it could not fully
examine.
clamscan |
What it does |
exav |
Status |
Notes |
--alert-broken[=yes/no] |
Alert on broken PE/ELF |
--detect broken |
renamed |
Both cover Mach-O too, although clamscan’s help says PE and ELF. |
--alert-broken-media[=yes/no] |
Alert on broken JPEG/TIFF/PNG/GIF |
--detect broken-media |
renamed |
|
--alert-encrypted[=yes/no] |
Alert on encrypted archives and documents |
--partial-as password-protected=found |
renamed |
exav reports an encrypted member it cannot decrypt as PASSWORD-PROTECTED by default (ClamAV returns a clean OK). found reports any encryption as a Heuristics.Encrypted.* detection, decrypted or not, as ClamAV does. |
--alert-encrypted-archive[=yes/no] |
Alert on encrypted archives only |
--partial-as password-protected=found |
renamed |
The one policy covers archives and documents together. |
--alert-encrypted-doc[=yes/no] |
Alert on encrypted documents only |
--partial-as password-protected=found |
renamed |
Same. |
--alert-macros[=yes/no] |
Alert on VBA macros in OLE2 |
--detect macros |
renamed |
exav also raises it for XLM and OOXML. |
--alert-exceeds-max[=yes/no] |
Alert on files exceeding a limit |
--partial-as limits-exceeded=found |
renamed |
exav reports a limit stop as LIMITS-EXCEEDED (status PARTIAL, exit 3) by default rather than as clean. found converts it into a Heuristics.Limits.Exceeded.* detection, which is the form a ClamAV-shaped pipeline expects. |
--alert-phishing-ssl[=yes/no] |
Alert on SSL mismatches in email URLs |
--detect phishing |
renamed |
Raises Heuristics.Phishing.Email.SSL-Spoof among others; there is no per-check switch. |
--alert-phishing-cloak[=yes/no] |
Alert on cloaked URLs in email |
--detect phishing |
renamed |
Same one detector. |
--alert-partition-intersection[=yes/no] |
Alert on overlapping DMG partitions |
--detect partition-intersection |
renamed |
exav also covers GPT, APM and MBR. |
--nocerts |
Disable Authenticode chain verification |
none |
absent |
exav’s Authenticode handling is parse- and blocklist-only, so there is no chain verification to disable. |
--dumpcerts |
Dump the Authenticode chain |
none |
absent |
|
clamscan |
What it does |
exav |
Status |
Notes |
--max-scantime=#n |
Skip a scan longer than this (ms) |
--max-scan-secs |
renamed |
Seconds, Unix only, and a kernel-enforced wall-clock plus CPU budget per job rather than an in-engine check. In a one-shot run it bounds the whole run, not each file. Refused on a listener outside the clamd worker pool (--workers threads, ICAP alone). |
--max-filesize=#n |
Skip files larger than this |
--max-input-bytes |
renamed |
exav’s default is no limit; ClamAV’s is 100M. --clamav-compat sets 100M. Over the limit exav reports LIMITS-EXCEEDED, not a clean OK, unless --partial-as ok (which --clamav-compat sets). |
--max-scansize=#n |
Max data scanned per container |
--max-matcher-bytes |
renamed |
exav’s default is 10G, ClamAV’s 400M. exav scans a streamed member without holding it, so this bounds CPU time rather than memory. What a scan holds is a fixed 1 GiB, lowered by --max-process-bytes; --clamav-compat makes it 400M. |
--max-files=#n |
Max files scanned per container |
--max-members |
renamed |
exav’s default is 100000 against ClamAV’s 10000, because exav descends into nested archives ClamAV does not and so counts more members for the same file. --clamav-compat sets 10000. |
--max-recursion=#n |
Max archive recursion depth |
--max-unpack-depth |
renamed |
Different default too: exav 16, ClamAV 17. --clamav-compat sets 17. 0 is refused. |
--max-dir-recursion=#n |
Max directory recursion depth |
none |
absent |
exav’s directory walk has no depth cap. |
--max-embeddedpe=#n |
Max size checked for an embedded PE |
none |
absent |
exav applies its global budgets instead of a per-subsystem cap. |
--max-htmlnormalize=#n |
Max HTML size to normalize |
none |
absent |
Same. |
--max-htmlnotags=#n |
Max normalized-HTML size to scan |
none |
absent |
Same. |
--max-scriptnormalize=#n |
Max script size to normalize |
none |
absent |
Same. |
--max-ziptypercg=#n |
Max ZIP size to re-type |
none |
absent |
Same. |
--max-partitions=#n |
Max partitions per disk image |
none |
absent |
Same. |
--max-iconspe=#n |
Max icons per PE |
none |
absent |
Same. |
--max-rechwp3=#n |
Max HWP3 parse recursion |
none |
absent |
Same. |
--pcre-match-limit=#n |
Max PCRE match calls |
none |
absent |
exav’s PCRE path has a bounded backtrack budget that is not operator-tunable. |
--pcre-recmatch-limit=#n |
Max recursive PCRE match calls |
none |
absent |
Same. |
--pcre-max-filesize=#n |
Max file size for PCRE subsignatures |
--max-pcre-bytes |
renamed |
Per object, as in ClamAV: a member under the limit is matched inside a larger archive. exav’s default is no limit, since an object is matched without being copied; --clamav-compat makes it ClamAV’s 100M. |
--disable-cache |
Disable the clean-file hash cache |
none |
absent |
exav has no scan cache, so there is nothing to disable. |
clamd takes almost no command-line configuration: it reads
/etc/clamav/clamd.conf and everything operational lives there.
exav does not read clamd.conf and has no --config-file; it is configured with
CLI flags and environment variables (see Configuration).
The wire protocol is compatible
(see the daemon guide), so existing clients keep working.
clamd |
What it does |
exav |
Status |
Notes |
--help, -h |
Show help |
same spelling |
same |
|
--version, -V |
Print version |
same spelling |
differs |
Prints exav <version>; the wire VERSION command answers the ClamAV <version> string clients expect. |
--foreground, -F |
Do not daemonize |
none |
absent |
exav’s daemon always runs in the foreground; run it under systemd, a supervisor or &. |
--debug |
Enable debug mode |
none |
absent |
|
--config-file=FILE, -c |
Read configuration from FILE |
none |
absent |
exav reads no configuration file. |
--fail-if-cvd-older-than=days |
Nonzero exit on a stale database |
none |
absent |
|
--datadir=DIRECTORY |
Load signatures from DIRECTORY |
-d / --sig-dir |
renamed |
Different spelling, same job. --sig-dir defaults to /var/lib/exav. |
--pid=FILE, -p |
Write the pid to FILE |
none |
absent |
Use the supervisor’s own pid tracking. |
The file is not read, so every directive below is absent as such. The exav column
gives the flag or environment variable that does the same job, or “none”.
| Directive |
What it does |
exav equivalent |
Notes |
LocalSocket |
Unix socket path to listen on |
--listen PATH |
A leading / is a socket path; the protocol defaults to clamd. |
LocalSocketGroup |
Group owning the socket |
none |
The socket takes the daemon’s own primary group; set that in the service unit (Group=) and pair it with ?mode=660. |
LocalSocketMode |
Socket permission bits |
--listen 'clamd:///path?mode=660' |
Same octal values, carried by the address because they are a property of that socket. exav’s default is 0600 where clamd’s is whatever the umask leaves (Default: disabled (socket is world accessible)), so widening it is explicit. The socket is created with no permissions and given the mode before it can be reached, so it never exists more open than asked for. |
FixStaleSocket |
Remove a leftover socket at startup |
default |
exav removes a stale socket before binding. |
TCPSocket |
TCP port to listen on |
--listen ADDR |
One value carries protocol, host and port. |
TCPAddr |
Address to bind |
--listen ADDR |
|
MaxConnectionQueueLength |
Listen backlog |
?max-connections= on the address |
Concurrent connections rather than a backlog. Default 128 (100 on ICAP). On the clamd listener it is read only under --workers threads: the prefork pool bounds concurrency by its worker count. ICAP always reads it. |
MaxThreads |
Worker thread count |
--workers N |
exav’s default is one prefork process per CPU core; --workers threads selects the in-process thread model. |
MaxQueue |
Max queued scan jobs |
none |
|
IdleTimeout |
Idle thread timeout |
none |
|
ReadTimeout |
Per-read socket timeout |
none |
Fixed at 60 s on the clamd listener. (ICAP’s is --icap-idle-secs.) |
CommandReadTimeout |
Command read timeout |
none |
Same 60 s. |
SendBufTimeout |
Send-buffer timeout |
none |
|
Foreground |
Do not daemonize |
default |
exav always runs in the foreground. |
User |
Drop privileges to this user |
none |
Set the user in the service unit. |
PidFile |
Write the pid here |
none |
|
ExitOnOOM |
Exit when out of memory |
none |
--max-process-bytes caps a worker’s address space instead, and the pool restarts the worker. |
SelfCheck |
Database freshness check interval |
none |
The daemon hot-reloads when the signature source changes on disk, and --auto-update adds the scheduled re-fetch that changes it. |
ConcurrentDatabaseReload |
Reload without pausing scans |
default |
exav loads the new database, starts serving from it, and lets scans in progress finish on the old one. |
| Directive |
What it does |
exav equivalent |
Notes |
LogFile |
Scan/status log path |
--log FILE |
Scan results only, one line per scan the daemon answers, under the daemon’s own view of the target (stream: for INSTREAM, fd: for FILDES). clamd’s log also carries startup, connection and reload lines; exav writes those to stderr for the supervisor to route. Reopened on SIGHUP, as clamd does. |
LogFileMaxSize |
Rotate at this size |
none |
|
LogFileUnlock |
Do not lock the log |
none |
|
LogRotate |
Rotate the log |
none |
Rotate with logrotate: exav reopens --log on SIGHUP. |
LogTime |
Timestamp log lines |
none |
|
LogClean |
Log clean files too |
none |
|
LogSyslog |
Log to syslog |
none |
exav writes to stdout/stderr; the supervisor routes it. |
LogFacility |
Syslog facility |
none |
|
LogVerbose |
Verbose logging |
none |
|
ExtendedDetectionInfo |
Log extra detection detail |
none |
|
Debug |
Enable debug output |
none |
|
| Directive |
What it does |
exav equivalent |
Notes |
DatabaseDirectory |
Where signatures live |
-d / --sig-dir DIR |
|
OfficialDatabaseOnly |
Load only official signatures |
none |
|
FailIfCvdOlderThan |
Refuse a stale database |
none |
|
DetectPUA |
Detect potentially unwanted applications |
--detect pua |
|
ExcludePUA / IncludePUA |
PUA category filters |
none |
PUA is all-or-nothing in exav. |
| Directive |
What it does |
exav equivalent |
Notes |
MaxScanSize |
Max data scanned per container |
--max-matcher-bytes |
|
MaxFileSize |
Max file size scanned |
--max-input-bytes |
|
MaxRecursion |
Max archive recursion |
--max-unpack-depth |
|
MaxFiles |
Max files per container |
--max-members |
|
MaxScanTime |
Max scan time |
--max-scan-secs, --max-pe-emulation-steps |
--max-scan-secs is kernel-enforced per job (seconds, Unix), not an in-engine check, and only in the clamd worker pool: ICAP scans have no time bound. The in-engine CPU bounds are --max-matcher-bytes and --max-pe-emulation-steps; the latter reports as Heuristics.Limits.Exceeded.MaxScanTime. |
MaxDirectoryRecursion |
Max directory depth |
none |
|
MaxEmbeddedPE, MaxHTMLNormalize, MaxHTMLNoTags, MaxScriptNormalize, MaxZipTypeRcg, MaxPartitions, MaxIconsPE, MaxRecHWP3 |
Per-subsystem caps |
none |
exav applies its global budgets instead. |
PCREMaxFileSize |
Max object size for PCRE subsignatures |
--max-pcre-bytes |
|
PCREMatchLimit, PCRERecMatchLimit |
PCRE backtracking bounds |
none |
Bounded internally, not tunable. |
StreamMaxLength |
Max INSTREAM upload |
--max-input-bytes, --max-spill-bytes |
clamd defaults to 100M and refuses more; exav has no default scan limit on a stream. --max-spill-bytes (2G) bounds the temp space one streamed object may occupy, which is the closest thing to a per-upload ceiling. Set --max-input-bytes if a client relied on the daemon to bound its uploads. |
StreamMinPort / StreamMaxPort |
Legacy STREAM port range |
none |
The STREAM command is removed from ClamAV too. |
CacheSize / DisableCache |
Clean-file hash cache |
none |
exav has no scan cache. |
| Directive |
What it does |
exav equivalent |
Notes |
ScanPE, ScanELF, ScanOLE2, ScanPDF, ScanSWF, ScanHTML, ScanXMLDOCS, ScanHWP3, ScanOneNote, ScanMail, ScanArchive, ScanImage, ScanImageFuzzyHash |
Switch one parser off |
none |
Every parser exav implements is always on. |
ScanPartialMessages |
Reassemble partial mail messages |
none |
|
PhishingSignatures, PhishingScanURLs |
Phishing detection |
none |
|
HeuristicAlerts, HeuristicScanPrecedence |
Heuristic policy |
none |
|
AlertBrokenExecutables |
Alert on broken PE/ELF |
--detect broken |
|
AlertBrokenMedia |
Alert on broken graphics |
--detect broken-media |
|
AlertEncrypted |
Alert on encrypted content |
--partial-as password-protected=found |
Any encryption, decrypted or not. Without it, exav reports members it cannot decrypt as PASSWORD-PROTECTED. |
AlertEncryptedArchive / AlertEncryptedDoc |
Split encrypted alerts |
--partial-as password-protected=found |
One policy covers both. |
AlertOLE2Macros |
Alert on VBA macros |
--detect macros |
|
AlertExceedsMax |
Alert on a limit stop |
--partial-as limits-exceeded=found |
exav reports LIMITS-EXCEEDED without it. |
AlertPartitionIntersection |
Alert on overlapping partitions |
--detect partition-intersection |
|
AlertPhishingSSLMismatch / AlertPhishingCloak |
Phishing alert detail |
--detect phishing |
One detector, no per-check switch. |
StructuredDataDetection |
Enable DLP detection |
--dlp-credit-cards / --dlp-ssns |
Giving a threshold enables it. |
StructuredMinCreditCardCount |
Credit-card threshold |
--dlp-credit-cards |
|
StructuredMinSSNCount |
SSN threshold |
--dlp-ssns |
|
StructuredCCOnly, StructuredSSNFormatNormal, StructuredSSNFormatStripped |
DLP format policy |
none |
|
DisableCertCheck |
Skip Authenticode verification |
none |
exav’s Authenticode handling is parse- and blocklist-only. |
CrossFilesystems |
Scan across mount points |
none |
exav’s walk crosses them, matching clamd’s default. |
FollowDirectorySymlinks / FollowFileSymlinks |
Symlink policy |
none |
exav matches clamd’s default (follow a directly-named link, do not descend into one found in a tree). |
ExcludePath |
Skip paths matching a regex |
--exclude / --exclude-dir |
|
Bytecode |
Run bytecode signatures |
none |
Always on in exav. |
BytecodeSecurity |
Bytecode trust level |
none |
|
BytecodeUnsigned |
Allow unsigned bytecode |
none |
exav performs no bytecode signature check. |
AllowAllMatchScan |
Permit ALLMATCHSCAN |
default |
Always permitted in exav. |
TemporaryDirectory |
Where temporary files go |
--spill-dir |
Defaults to TMPDIR; --spill-dir off writes none at all. |
ForceToDisk, LeaveTemporaryFiles |
Temporary-file policy |
none |
A streamed object past --spill-threshold-bytes, and a member that decodes past --max-object-bytes, go to a spill file, deleted when the scan ends. |
GenerateMetadataJson |
Emit engine metadata JSON |
none |
--json emits scan results, a different thing. |
| Directive group |
What it does |
exav |
OnAccessMountPath, OnAccessIncludePath, OnAccessExcludePath, OnAccessExcludeUID, OnAccessExcludeUname, OnAccessExcludeRootUID, OnAccessMaxFileSize, OnAccessMaxThreads, OnAccessDisableDDD, OnAccessPrevention, OnAccessExtraScanning, OnAccessDenyOnError, OnAccessRetryAttempts |
Real-time on-access scanning (fanotify) |
Not supported. Keep ClamAV if you depend on it. |
VirusEvent |
Run a command on detection |
Not supported. Drive it from the daemon’s reply or the scan output. |
PreludeEnable, PreludeAnalyzerName |
Prelude SIEM integration |
Not supported. |
exav acts as a daemon client when given --connect together with paths.
clamdscan |
What it does |
exav |
Status |
Notes |
--help, -h |
Show help |
same spelling |
same |
|
--version, -V |
Print version |
same spelling |
differs |
Answered locally (exav <version>), where clamdscan asks the daemon and prints its ClamAV <version> reply. Use --ping to check the daemon is there; the wire VERSION still answers the ClamAV string to anything that speaks the protocol. |
--verbose, -v |
Be verbose |
--verbose |
differs |
clamdscan -v prints nothing a plain run does not. exav’s names the daemon that answered and the command sent per target ( [daemon] unix:… ClamAV …, [SCAN] /abs/path). The informational findings -v adds to a local scan come from the scanner, and a daemon reply carries only a verdict. |
--quiet |
Only output error messages |
--quiet |
differs |
Same difference as the scanner: exav still prints detections. |
--stdout |
Write to stdout instead of stderr |
none |
absent |
exav already writes results to stdout. |
--log=FILE, -l |
Save scan report to FILE |
--log |
same |
Client replies are mirrored into the log. -l is absent. |
--file-list=FILE, -f |
Scan files listed in FILE |
--files-from |
renamed |
-f is absent. |
--ping, -p A[:I] |
Ping the daemon until it answers |
--ping |
differs |
One probe, not A attempts at I seconds; a supervisor or HEALTHCHECK owns the retrying. With no --connect it probes the listener this configuration serves, so a container health check needs no address, and it speaks the protocol it finds there: PING on clamd, OPTIONS on ICAP. |
--wait, -w |
Wait for the daemon to start |
none |
absent |
|
--remove |
Delete infected files |
none |
absent |
Out of scope by design. |
--move=DIRECTORY |
Move infected files |
none |
absent |
Same. |
--copy=DIRECTORY |
Copy infected files |
none |
absent |
Same. |
--config-file=FILE, -c |
Read configuration from FILE |
none |
absent |
exav reads no configuration file; name the daemon with --connect. |
--allmatch, -z |
Keep scanning after a match |
--all-matches |
renamed |
Sends ALLMATCHSCAN. -z is absent, and it cannot be combined with --send-as contents/fd: one INSTREAM gets one verdict back, so an all-match scan is not expressible over them. |
--multiscan, -m |
Force MULTISCAN mode |
none |
absent |
exav’s client sends one SCAN per file inside an IDSESSION. The daemon answers MULTISCAN on the wire. |
--infected, -i |
Only print infected files |
--quiet |
renamed |
|
--no-summary |
No summary at end |
--quiet |
renamed |
Same dial. |
--reload |
Ask the daemon to reload |
none |
absent |
The daemon answers RELOAD on the wire; no client flag sends it. |
--fdpass |
Pass a file descriptor to the daemon |
--send-as fd |
renamed |
Same FILDES/SCM_RIGHTS request. Over a TCP --connect exav refuses it: a descriptor cannot cross a TCP connection, and clamdscan silently sends the path instead, which scans whatever that path holds on the daemon’s host. |
--stream |
Stream file contents to the daemon |
--send-as contents |
renamed |
Same INSTREAM request, reported under the local name. |
- (stdin) |
Scan standard input |
- |
differs |
Both stream it. exav reports it as stdin, the name a local exav - uses, where clamdscan prints the daemon’s own stream: (or fd:, when stdin is a regular file it can pass by descriptor). |
Two client-mode behaviours have no flag:
- Directories always recurse.
clamdscan hands a directory to the daemon to
walk; exav walks it client-side and sends one SCAN per file, so --exclude /
--include apply and each command has one reply. A directory holding the parts
of a byte-split archive goes over whole as one CONTSCAN, so the daemon can
rejoin them.
- The name in a result line. By path, exav reports the absolute path it sent,
as
clamdscan does. By content (--send-as contents/fd), it reports the path
as written on the command line, where clamdscan resolves it.
| exav flag |
What it does |
--sig-dir <DIR> |
The directory signatures live in, loaded and (by --auto-update) written to unless -d is given (default /var/lib/exav). |
--sig-sources <URL|FILE> |
Where --auto-update fetches from: exact URLs, mirror bases (trailing /), or a file of either, which may be a freshclam.conf. |
--db-url <URL> |
A prebuilt .exavdb to pull and serve instead of signature files. |
--build-db <FILE> |
Compile the loaded signatures into a prebuilt .exavdb and exit. |
--listen <ADDR> |
Serve on this address. clamd:// and icap://; naming both serves both from one process over one database. |
--connect <ADDR> |
Scan by handing each file to a daemon already running here. |
--send-as <WHAT> |
What that client hands over: path, contents or fd. |
--auto-update |
Bootstrap, refresh and hot-reload the signature source for as long as the process runs. With no --listen and no paths it is an updater and nothing else. |
--startup-wait-secs <SECS|off> |
How long to wait for a sidecar to populate an empty signature directory. |
--update-interval-secs <SECS|off> |
Seconds between signature source re-checks. |
--allow-no-db |
Run against the built-in EICAR-only baseline instead of refusing. Testing only. |
--workers <N|threads> |
Prefork worker processes, or the in-process thread model. |
--max-jobs-per-worker <N|off> |
Recycle a worker process after this many jobs. |
--max-process-bytes <SIZE|off> |
Address-space cap (RLIMIT_AS): per worker in the clamd pool, the whole process otherwise. |
--allow-shutdown |
Honour the clamd SHUTDOWN command. Off by default. |
--allow-http-scan |
Fetch http(s):// scan targets, one-shot or through SCANURL. Off by default. |
--max-object-bytes <SIZE|off> |
The most memory a single decoded object may use. |
--max-matcher-bytes <SIZE|off> |
Cumulative bytes fed to the matcher: a CPU bound, not a memory one. |
--max-pe-emulation-steps <N|off> |
Instructions the PE unpacking emulator may run across one top-level file. |
--spill-dir, --spill-threshold-bytes, --max-spill-bytes, --max-total-spill-bytes |
Where a streamed object, or an archive member past --max-object-bytes, waits while it is scanned, and how much RAM and temp space it may take. |
--partial-as <POLICY> |
What becomes of an object exav could not fully examine: partial (default), ok, found or error, whole or per condition (limits-exceeded=, unscannable=, password-protected=). |
--clamav-compat |
Preset reproducing a stock ClamAV build’s limits and extractor set, for differential testing. Reduces detection on purpose. |
--decode <LIST> / --no-decode <LIST> |
Encodings to recover a payload from before scanning it: base64 today, meaning both a run long enough to hold an executable and the base64 assets a markup document embeds. On by default, unlike --detect. |
--detect packed |
Report Heuristics.Packed.*, naming the packer wrapping an executable exav could not unpack. |
--detect phishing |
Report Heuristics.Phishing.Email.* for display-versus-href link spoofing. Covers the checks ClamAV splits across --alert-phishing-ssl and --alert-phishing-cloak. |
--detect exav-heuristics |
Enable exav-exclusive structural / fuzzy / ML analysis. |
--no-detect <LIST> |
Detectors to leave off, subtracted from --detect. |
--passwords <PW> |
Password to try for encrypted members. Repeatable. |
--passwords-from <FILE> |
Passwords from a file, one per line, kept out of process listings. |
--json |
Newline-delimited JSON results, one object per input plus a summary. |
--profile |
Per-matcher timing breakdown: a CSV row per file when scanning, MATCHERSTATS through STATS on a listener. |
--slow-scan-secs <SECS|off> |
Log any scan taking longer, naming the object. |
--metrics-secs <SECS|off> |
Seconds between a listener’s scan-totals log lines. |
--icap-* |
The ICAP listener’s settings: service names, preview, keep-alive, the X-Infection-Found policy. See the ICAP guide. |
The rows worth acting on before a migration:
- No bytecode signature check. exav runs
.cbc programs without verifying who
signed them, ClamAV’s --bytecode-unsigned=yes behaviour with no way to tighten
it. Load bytecode only from sources you trust.
INSTREAM has no default size limit. clamd caps a stream at
StreamMaxLength (100M); exav bounds the temp space one streamed object may take
(--max-spill-bytes, 2G). Set --max-input-bytes if a client relied on the
daemon to bound its uploads.
- The daemon’s socket is 0600 unless widened.
LocalSocketMode 660 becomes
--listen 'clamd:///path?mode=660', and the socket takes the daemon’s own group,
so the service unit must run under the group the clients share.
--quiet still prints detections, where clamscan --quiet is silent.
- Every parser toggle is absent, so a configuration that switched one off
fails at startup.
--multiscan, --wait and --reload are absent in the client. The daemon
answers MULTISCAN and RELOAD on the wire, so clamd clients keep working;
exav’s own client has no flag to send them. --ping exists, for health checks.
--send-as fd over a TCP --connect is refused. clamdscan silently sends
the path instead, so the daemon scans whatever that path holds on its host.
- Every limit flag with an exav equivalent is renamed, and the error names
the exav flag.
ClamAV’s side of the clamscan and clamdscan tables is the --help output of
ClamAV 1.4.3, with the behavioural rows run: clamscan against the same trees as
exav, and clamdscan against exav’s own daemon
(clamdscan -c <conf> --stream | --fdpass | -). clamd’s flags come from the
clamd.8 manual page and the directives from clamd.conf.sample, both from the
upstream rel/1.4 branch; claims about a clamd.conf directive’s own behaviour
are read from those, not run.
exav’s side is read from the clap definitions in the exav crate and checked by
running the built binary against each flag.