You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu20.04迁23.04后PHP调用ClamAV扫描报非正规文件错误

问题:Ubuntu 23.04下PHP调用clamdscan扫描文件报错"Not a regular file"

将服务从Ubuntu 20.04迁移至23.04后,使用ClamAV扫描上传文件的Web表单出现异常,具体表现为:

  • 日志/var/log/clamav/clamav.log报错:fd[10]: Not a regular file. ERROR
  • PHP的exec命令返回码为2,扫描输出如下:
(
    [0] => /tmp/php0HjwDM: Not a regular file ERROR
    [1] => 
    [2] => ----------- SCAN SUMMARY -----------
    [3] => Infected files: 0
    [4] => Total errors: 1
    [5] => Time: 0.000 sec (0 m 0 s)
    [6] => Start Date: 2023:06:28 17:08:03
    [7] => End Date:   2023:06:28 17:08:03
)

将文件移动到/import/目录后再次扫描,仍报相同错误:

Array
(
    [0] => /import/myfile.csv: Not a regular file ERROR
    [1] => 
    [2] => ----------- SCAN SUMMARY -----------
    [3] => Infected files: 0
    [4] => Total errors: 1
    [5] => Time: 0.000 sec (0 m 0 s)
    [6] => Start Date: 2023:06:28 17:08:03
    [7] => End Date:   2023:06:28 17:08:03
)

测试代码

if ($_POST) {
$uploadfile = '/import/' . basename($_FILES['userfile']['name']);
$scanpath=escapeshellarg($_FILES['userfile']['tmp_name']);
$cmd='clamdscan --fdpass '.$scanpath;
$retcode=-1;
$out='';
exec($cmd,$out,$retcode);
echo $retcode.'<br /><pre>';
print_r ($out);
echo '</pre>';
echo '<br />Now moving <br />';
move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile);
$cmd='clamdscan --fdpass '.$uploadfile;
$retcode=-1;
$out='';
exec($cmd,$out,$retcode);
echo $retcode.'<br /><pre>';
print_r ($out);
echo '</pre>';
}
?>

<form enctype="multipart/form-data" action="testpost.php" method="POST">
    Send this file: <input name="userfile" type="file" />
    <input type="submit" value="Send File" />
</form>

已尝试的操作

  • 测试多种文件类型,问题一致
  • 配置ClamAV以www-data运行,修复套接字文件夹权限
  • 将文件移动到/import/目录(已设777权限)扫描,排除临时文件问题
  • 在shell中以www-data或clamav用户执行clamdscan --fdpass可正常扫描,但PHP exec调用失败
  • 改用clamscan可正常运行,但扫描速度极慢无法投入使用:
Array
(
    [0] => /tmp/phpFahZwQ: OK
    [1] => 
    [2] => ----------- SCAN SUMMARY -----------
    [3] => Known viruses: 8669716
    [4] => Engine version: 0.103.8
    [5] => Scanned directories: 0
    [6] => Scanned files: 1
    [7] => Infected files: 0
    [8] => Data scanned: 0.00 MB
    [9] => Data read: 0.00 MB (ratio 0.00:1)
    [10] => Time: 13.043 sec (0 m 13 s)
    [11] => Start Date: 2023:06:29 11:39:06
    [12] => End Date:   2023:06:29 11:39:19
)

解决建议

  1. 检查AppArmor限制
    Ubuntu 23.04的AppArmor规则可能限制了clamav进程访问目标文件的权限。临时关闭clamav的AppArmor配置测试:
sudo aa-disable /etc/apparmor.d/usr.sbin.clamd

若测试有效,修改/etc/apparmor.d/usr.sbin.clamd规则,添加对PHP临时目录(默认/tmp/)和/import/目录的访问权限,例如:

/tmp/** r,
/import/** r,

然后重新加载规则:

sudo aa-enforce /etc/apparmor.d/usr.sbin.clamd
  1. 调整clamdscan调用参数
    移除--fdpass参数,直接传递文件路径。该参数用于传递文件描述符,可能在PHP环境下存在权限或环境变量冲突。修改代码中的命令为:
$cmd='clamdscan '.$scanpath;

注意保留escapeshellarg对路径的转义,避免命令注入风险。

  1. 验证PHP的open_basedir限制
    检查php.ini中的open_basedir配置,确保其包含PHP临时文件目录和/import/目录,否则PHP进程无法访问这些路径,导致clamdscan无法读取文件。修改后重启PHP服务生效。

  2. 确认clamav套接字权限
    检查/etc/clamav/clamd.conf中的LocalSocketGroup是否设置为www-data,并确保套接字文件(默认/run/clamav/clamd.ctl)的组权限允许www-data读写:

sudo chgrp www-data /run/clamav/clamd.ctl
sudo chmod g+rw /run/clamav/clamd.ctl

内容的提问来源于stack exchange,提问作者R Taylor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 10:18:13