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 )
解决建议
- 检查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
- 调整clamdscan调用参数
移除--fdpass参数,直接传递文件路径。该参数用于传递文件描述符,可能在PHP环境下存在权限或环境变量冲突。修改代码中的命令为:
$cmd='clamdscan '.$scanpath;
注意保留escapeshellarg对路径的转义,避免命令注入风险。
验证PHP的open_basedir限制
检查php.ini中的open_basedir配置,确保其包含PHP临时文件目录和/import/目录,否则PHP进程无法访问这些路径,导致clamdscan无法读取文件。修改后重启PHP服务生效。确认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
相关产品推荐
相关产品推荐

