使用apache和perl在DocumentRoot外部读/写文件

时间:2015-01-22 05:06:57

标签: apache perl

我有一个由其他人编写的perl cgi脚本,我试图维护而不是真正理解它。来自从apache运行的脚本的以下代码段应该从文件中读取一个字符串,但它会因为权限被拒绝而失败。

这是在带有perl-5.18.4和apache-2.4.10的fedora20系统上。

$changepass_dir值为/var/changepass_temp,由apache.apache拥有。如果我su用户apache,我可以正常阅读$value{'username'}.fail中的/var/changepass_temp文件。

但是,直接从apache运行时会打印OOPs /var/changepass_temp user1 -- Permission denied

if(-e "$changepass_dir/$value{'username'}\.fail"){

                    &login_fail($value{'username'},$value{'ip'});
                    open(IN,"$changepass_dir/$value{'username'}\.fail") || print ("OOPs $changepass_dir $value{'username'}  -- $!");
                    my $message = join('',<IN>);
                    unlink("$changepass_dir/$value{'username'}.fail");
                    &print_error($message);
                    last;
 }

整个脚本长达数百行,所以我认为发布整个内容并不合适。希望这里有足够的数据来确定这是一个问题吗?

谢谢, 亚历

1 个答案:

答案 0 :(得分:0)

您的代码看起来不错,我不认为问题就在那里。您在日志中收到该错误的原因是因为open失败 - 而是打印错误 - 但您的脚本继续运行并仍尝试从无法访问的文件中读取数据。 (这可能不是一件好事,因为它会删除文件而不进行处理)。

这将是与权限相关的。

因为您的-e测试有效(文件存在),这意味着您拥有一些权限,并且正在查找正确的位置。这意味着您可以比较该目录的访问权限,看看是否存在任何差异。

根据您迄今为止所做的事情,我最好的猜测是您的脚本并非apache身份运行。为了避免利用条件,进一步删除脚本的权限并不罕见。

测试方法 - 一个简单的ps可能会成功,但您可以尝试添加:

open ( my $tmp_file, ">", '/tmp/test_file' ) or warn $!; 

检查是否已创建文件以及谁拥有该文件。