我们有一个在busybox的shell下运行的现有脚本,该脚本使用exec打开具有特定文件描述符的文件,然后在调用flock时使用该文件描述符以防止并发实例运行。类似的东西:
exec 200> /var/run/applock
flock 200
从命令行和cron运行时脚本运行正常,但是当从Web服务器的php系统调用运行时,exec失败,错误代码为2,权限被拒绝。我创建了一个重现问题的最小例子:
test.htm有以下php:
$res = 0;
system("/tmp/testing", $res);
print($res);
正在调用的/ tmp /测试脚本(在php系统调用中也使用sudo测试了这个场景,所以在这个脚本中我记录了UID以验证它是root,但它也失败了):
#!/bin/sh
logger $(id)
exec 200> /tmp/lock
logger Done
exit 0
文件的权限,每个人的完整权限:
(host:root) /tmp $ ls -la testing lock
-rwxrwxrwx 1 root root 0 Mar 26 13:38 lock
-rwxrwxrwx 1 root root 65 Mar 26 13:32 testing
网页中的结果为2,并在/ var / log / messages中记录以下内容(表示脚本实际上正在执行):
Mar 26 14:35:36 host user.notice www: uid=11(www) gid=11(www) groups=11(www)
我们正在使用PHP 5.5.9,BusyBox 1.21.1,lighttpd 1.4.35(使用mod_fastcgi for php)。在php.ini中,未启用安全模式,我们不使用disable_functions。
一个有趣的注意事项是当我从命令行以用户www(与lighttpd运行的用户相同)运行它时,这些文件有效:
/usr/local/bin/php-cgi -f test.htm
为了清楚起见,我们以类似的方式从Web服务器运行了许多脚本,这些脚本工作正常,并且所讨论的脚本一直运行直到它遇到" exec 200>的/ var /运行/的AppLock&#34 ;.任何帮助将不胜感激。