如何使用clamav_client crate获取clamd检测到的病毒名称?
使用clamav_client获取clamd检测到的病毒名称
现有基于clamav_client的代码仅能判断数据是否感染病毒,无法获取具体的病毒名称:
let buffer = br#"X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*"#; let scan_buffer_response = clamav_client::scan_buffer(buffer, clamd_tcp, None).unwrap(); let data_clean = clamav_client::clean(&scan_buffer_response).unwrap(); if ! data_clean { println!("The data is infected!"); // 但具体是哪种病毒? }
解决方案
clamav_client::scan_buffer返回的是clamd的原始响应字符串,其中已经包含病毒名称信息,无需依赖clean函数的结果判断。clamd对感染文件的响应格式为stream: [病毒名] FOUND,对正常文件的响应为stream: OK,直接解析该字符串即可提取病毒名。
修改后的代码示例:
let buffer = br#"X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*"#; let scan_response = clamav_client::scan_buffer(buffer, clamd_tcp, None).unwrap(); // 解析clamd响应提取病毒名 if scan_response.contains("FOUND") { // 按格式分割字符串,提取病毒名称 if let Some(virus_name) = scan_response.split(':').nth(1) .and_then(|s| s.split_whitespace().nth(0)) { println!("检测到病毒:{}", virus_name.trim()); } else { println!("数据已感染,但无法识别病毒名称"); } } else if scan_response.contains("OK") { println!("数据未感染病毒"); } else { println!("扫描响应异常:{}", scan_response); }
说明
- clamd的响应格式是标准化的,感染时返回
[扫描目标]: [病毒名] FOUND,正常时返回[扫描目标]: OK - 生产环境中建议替换
unwrap为match或if let处理错误,避免程序 panic
内容的提问来源于stack exchange,提问作者Code4R7
相关产品推荐
相关产品推荐

