我进行了广泛搜索,找不到任何特别像这样的东西。
我在一个目录中拥有一个由“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 拥有的文件的权限被拒绝。