2

我进行了广泛搜索,找不到任何特别像这样的东西。

我在一个目录中拥有一个由“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,这是一些从 JavaScript 调用的 JSON 格式的网站负载统计信息,而任何捕获的错误都应该写入 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 拥有的文件的权限被拒绝。

4

2 回答 2

5

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

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

请改用双引号。

于 2013-04-09T23:13:10.190 回答
1

还有两件事要尝试:

lsattr /var/log/apache2/load.log

这将检查您的日志文件的扩展属性。其中一个属性是不可变的,它使您的文件无论用户权限如何都是只读的。

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

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

于 2013-04-09T23:02:26.583 回答