我进行了广泛搜索,找不到具体的内容。
我有一个由“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拥有的文件的权限被拒绝。
答案 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的发行版相关(在这种情况下,您还应该在系统日志中收到更多错误和警告)