我有一个由其他人编写的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;
}
整个脚本长达数百行,所以我认为发布整个内容并不合适。希望这里有足够的数据来确定这是一个问题吗?
谢谢, 亚历
答案 0 :(得分:0)
您的代码看起来不错,我不认为问题就在那里。您在日志中收到该错误的原因是因为open
失败 - 而是打印错误 - 但您的脚本继续运行并仍尝试从无法访问的文件中读取数据。 (这可能不是一件好事,因为它会删除文件而不进行处理)。
这将是与权限相关的。
因为您的-e
测试有效(文件存在),这意味着您拥有一些权限,并且正在查找正确的位置。这意味着您可以比较该目录的访问权限,看看是否存在任何差异。
根据您迄今为止所做的事情,我最好的猜测是您的脚本并非以apache
身份运行。为了避免利用条件,进一步删除脚本的权限并不罕见。
测试方法 - 一个简单的ps
可能会成功,但您可以尝试添加:
open ( my $tmp_file, ">", '/tmp/test_file' ) or warn $!;
检查是否已创建文件以及谁拥有该文件。