用户使用Perl和Cron拥有的文件权限被拒绝

时间:2013-04-09 22:32:54

标签: perl apache logging cron permission-denied

我进行了广泛搜索,找不到具体的内容。

我有一个由“apache”拥有和写入的日志文件,该目录也由“apache”拥有和写入:

-rw-rw-r-- 1 apache apache 0 Apr  9 16:43 /var/log/apache2/load.log

我有一个Perl程序“load.pl”,其中包含以下内容:

my $log = "/var/log/apache2/load.log";
my $error = "";

#...doing useful stuff here, where $error might get set

if ($error && $log)
{
    if (open (LOG, '>>$log'))
    {
            print LOG "[".localtime(time)."] ".$error."\n";
            close (LOG);
    }
    else
    {
            my $reason = $!;
            $error .= "Could not open log file as ".getpwuid($>)." (really ".getpwuid($<)."): $reason";

            my $subject = "load.pl could not write to $log";
            $error .= email($mailto, $replyto, $subject, $error);
    }
}

$ mailto,$ replyto和email()子例程的定义和工作正常。

我通过crontab运行这个程序,如下所示:

*/1 * * * *     apache  flock -x -w 10 /home/web/load.txt -c "perl /home/web/load.pl> /home/web/load.txt 2>&1"

Load.txt获取STDOUT,这是一些JSON格式的网站加载统计信息,可以从JavaScript调用,而任何捕获的错误都应该写入load.log。除日志写作外,一切正常。

我通过电子邮件发送以下输出...

Subject: load.pl could not write to /var/log/apache2/load.log
Could not open log file as apache (really apache): Permission denied

很明显,Perl正在以“apache”执行此程序 - 有效和真实的UID。但是我在apache拥有的目录中获得apache拥有的文件的权限被拒绝。

2 个答案:

答案 0 :(得分:5)

使用单引号不会扩展变量:

if (open (LOG, '>>$log'))

请改用双引号。

答案 1 :(得分:1)

还有两件事要尝试:

lsattr /var/log/apache2/load.log

这将检查日志的扩展属性。其中一个属性是immutable,它使您的文件只读取用户权限。

ls -Z /var/log/apache2/load.log

这将显示SELinux上下文,并且仅与基于RedHat / Hardened Gentoo的发行版相关(在这种情况下,您还应该在系统日志中收到更多错误和警告)