从php调用时,busybox shell脚本中的exec失败

时间:2015-03-26 22:05:25

标签: php lighttpd busybox

我们有一个在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 ;.任何帮助将不胜感激。

0 个答案:

没有答案