官方参考文档 Building ClamAV with Autotools (v0.103 and older),根据自己的系统选择构建方式,我使用的是centos7
准备环境
yum install -y epel-release
yum install -y dnf-plugins-core
yum install -y \
`# install tools` \
gcc gcc-c++ make valgrind \
`# install clamav dependencies` \
bzip2-devel check-devel json-c-devel libcurl-devel libxml2-devel \
ncurses-devel openssl-devel pcre2-devel sendmail-devel zlib-devel
下载源码并编译
下载地址:ClamAVNet,本次下载的源码版本为0.103.7
### 进入linux存放源码的目录
# 解压
tar -zxvf clamav-0.103.7.tar.gz
# 进入目录
cd clamav-0.103.7
# 创建build 文件夹 并进入(官方说创建该文件夹是为了后面卸载容易)
mkdir build && cd build
## 编译安装
../configure
make
make check VG=1 # 这步做了一个检查 可以省略
make install # 官方提供的是sudo make install,因为我全文都用的root用户 所以没加make
配置clamav
#在此处我都是采用了配置文件中的默认配置,没进行修改。主要进行了一下操作
-
进入配置文件目录
cd /usr/local/etc/
-
备份配置文件
cp clamd.conf.sample clamd.conf cp freshclam.conf.sample freshclam.conf
-
修改配置文件
vim clamd.conf
-
修改如下:主要是放开了一部分注释,注释掉了 Example,这个很重要
# 注释掉了 Examle ### Example # 打开了 LogFile /tmp/clamd.log PidFile /var/run/clamd.pid DatabaseDirectory /var/lib/clamav TCPSocket 3310 TCPAddr *
vim freshclam.conf
-
修改如下:主要是放开了一部分注释,注释掉了 Example,这个很重要
DatabaseDirectory /var/lib/clamav UpdateLogFile /var/log/freshclam.log PidFile /var/run/freshclam.pid DatabaseOwner root # 默认用户是clamav,如果不修改此处,那就需要创建clamav用户,这都是可以的 DatabaseMirror database.clamav.net
-
-
更新病毒库
cd /usr/local/bin/ ./freshclam
-
启动cleamav
cd /usr/local/sbin/ ./clamd
-
查看监听端口
netstat -tunlp } grep 3310
编写Java程序,调用ClamAV,完成文件杀毒
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>fi.solita.clamav</groupId>
<artifactId>clamav-client</artifactId>
<version>1.0.1</version>
</dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-ui</artifactId>
<version>1.6.11</version>
</dependency>
</dependencies>
server:
port: 8877
clamav:
ipAddress: 127.0.0.1
port: 3310
timeout: 600000
spring:
servlet:
multipart:
max-file-size: 4096MB
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ClamAVTestMain {
public static void main(String[] args) {
SpringApplication.run(ClamAVTestMain.class, args);
}
}
import fi.solita.clamav.ClamAVClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ClamAVClientConfig {
@Value("${clamav.ipAddress}")
private String ipAddress;
@Value("${clamav.port}")
private Integer port;
@Value("${clamav.timeout}")
private Integer timeout;
@Bean
public ClamAVClient getClamAVClient(){
return new ClamAVClient(ipAddress,port,timeout);
}
}
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class OpenAPIConfig {
@Bean
public OpenAPI getOpenAPI(){
return new OpenAPI().info(new Info().version("0.0.1").description("文件查杀..."));
}
}
import fi.solita.clamav.ClamAVClient;
import io.swagger.v3.oas.annotations.Operation;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
@RestController
@RequestMapping("scan")
public class TestController {
@Resource
ClamAVClient clamAVClient;
@Operation(summary = "测试服务器是否连接成功")
@GetMapping("")
public String test() throws IOException {
boolean ping = clamAVClient.ping();
if (ping){
System.out.println("服务器连接成功");
return "服务器连接成功";
}
System.out.println("服务器连接失败");
return "服务器连接失败";
}
@Operation(summary = "扫描文件")
@PostMapping(value = "file",consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public String scanFile(@RequestParam("multipartFile") MultipartFile multipartFile) throws IOException {
if (!multipartFile.isEmpty()){
InputStream inputStream = multipartFile.getInputStream();
byte[] scan = clamAVClient.scan(inputStream);
return new String(scan, StandardCharsets.UTF_8);
}
return "没有上传文件";
}
}
一些服务命令
#启动clamav-freshclam服务
systemctl start clamav-freshclam.service
systemctl enable clamav-freshclam.service
systemctl status clamav-freshclam.service
systemctl stop clamav-freshclam.service
#启动远程服务
systemctl start clamav-daemon.service
systemctl enable clamav-daemon.service
systemctl status clamav-daemon.service
systemctl stop clamav-daemon.service