perl:什么会导致perl找不到存在的文件?

perl:什么会导致perl找不到存在的文件?,perl,Perl,运行perl cgi脚本时,我遇到了一个错误,它找不到它试图打开的文件。我检查apache错误日志/var/log/apache2/error.log: [Tue Jan 13 20:59:17 2015] [error] [client ::1] [Tue Jan 13 20:59:17 2015] submit.cgi: [Tue Jan 13 20:59:17 2015] submit.cgi: /home/jddancks/Documents/perl/homeworks/hw13/g

运行perl cgi脚本时,我遇到了一个错误,它找不到它试图打开的文件。我检查apache错误日志/var/log/apache2/error.log:

[Tue Jan 13 20:59:17 2015] [error] [client ::1] [Tue Jan 13 20:59:17 2015] submit.cgi: [Tue Jan 13 20:59:17 2015] submit.cgi: 
/home/jddancks/Documents/perl/homeworks/hw13/grades4.txt: No such file or directory at /var/www/homeworks/hw13/CreateExam.pm line 48., referer: http://localhost/homeworks/hw13/test.cgi
反复检查:

root@debian-macbook:/var/log/apache2# ls -l /home/jddancks/Documents/perl/homeworks/hw13/grades4.txt
-rwxrwxrwx 1 jddancks jddancks 2095 Jan  7 12:25 /home/jddancks/Documents/perl/homeworks/hw13/grades4.txt
为什么会发生这种情况?这是一台运行Apache2.2IDK的debian机器,如果有帮助的话

有两个文件:submit.cgi和CreateExam.pm。 submit.cgi:

use CreateExam;
...
my $path = `pwd`;
...
my $check = CreateExam->new("${path}/exam4.txt","${path}/answers4.txt","${path}/grades4.txt",$pathroot);
$check->entergrades($cookie_value,$cgi->Vars());
CreateExam.pm:

package CreateExam;

sub new {
    my ($class,$file,$answers,$grades,$script) = @_;
    #print "<p>in new: file: $file, grades: $grades</p>\n";
    return bless {'file'=>$file,'answers'=>$answers,'gradefile'=>$grades,'script'=>$script},$class;
}

sub tooktest {
    my ($self,$person) = @_;
    #print "<p>in tooktest: person: $person</p>\n";
    my $grades = $self->{'gradefile'};
    open(ANS,"< $grades") or die "$grades: $!";
    my $found = 0;
    LAST: while(my $line = <ANS>) {
        if($line =~ /\<test taker=$person/) { $found = 1; last LAST;}
    }
    return $found==1;
}
hexdump:

jddancks@debian-macbook:~/Documents/perl/homeworks/hw13$ perl -e 'print qx(pwd)' | hexdump -C
00000000  2f 68 6f 6d 65 2f 6a 64  64 61 6e 63 6b 73 2f 44  |/home/jddancks/D|
00000010  6f 63 75 6d 65 6e 74 73  2f 70 65 72 6c 2f 68 6f  |ocuments/perl/ho|
00000020  6d 65 77 6f 72 6b 73 2f  68 77 31 33 0a           |meworks/hw13.|
0000002d

如果将Apache配置为在
chroot
中运行,则在主机系统上根本看不到
/home

如果将Apache配置为在
chroot
中运行,则在主机系统上根本看不到
/home

pwd
返回工作目录,后跟一行新行,这就是您分配给$path的内容。然后尝试打开
“/home/jddancks/Documents/perl/homeworks/hw13\n/grades4.txt”
,它确实有一个不存在的目录

试着做:

chomp( my $path = `pwd` );

正如您的hextump所示,
pwd
返回工作目录,后跟一个换行符,这就是您分配给$path的内容。然后尝试打开
“/home/jddancks/Documents/perl/homeworks/hw13\n/grades4.txt”
,它确实有一个不存在的目录

试着做:

chomp( my $path = `pwd` );


您是否有可能提供
submit.cgi
code或者我们必须弄清楚它是什么?它相当长。我来看看是否可以把相关的代码片段放进去。
pwd
生成的字符串是否包含换行符?您可能需要
chomp
it。另外,您可以直接替换
$found=1,而不是使用
LAST:
标签和有点神秘的
返回$found==1;最后使用
返回1
。然后将
return$found==1
替换为
return 0
@jasondancks也许apache用户没有权限读取目录?@Jens在这种情况下,错误不会是
权限被拒绝
吗?你有没有可能提供
submit.cgi
代码,或者我们必须弄清楚它是什么?这很好长的我来看看是否可以把相关的代码片段放进去。
pwd
生成的字符串是否包含换行符?您可能需要
chomp
it。另外,您可以直接替换
$found=1,而不是使用
LAST:
标签和有点神秘的
返回$found==1;最后使用
返回1
。然后将
return$found==1
替换为
return 0
@jasondancks可能apache用户没有读取目录的权限?@Jens在这种情况下,错误不是
权限被拒绝了吗?这没有帮助,这不是脚本中的问题,如果试图显式打开硬编码文件名“/home/jddancks/Documents/perl/homeworks/hw13/grades4.txt”,会出现什么错误?(例如,
print“got error$!(“($!+0)。”)\n“
)I got:got error没有这样的文件或目录(2)。我最近甚至尝试在我的机器(debian)上安装suExec。没有帮助。我知道这个文件确实存在。可能是某种奇怪的损坏导致的吗?似乎是cgi脚本运行在与您预期不同的服务器上,或者是chroot没有暴露整个文件系统。在脚本中,尝试打印
join(“,”、glob(“/*”)和glob(“/home/*”)
以查看其中的内容。我呃。。。如果追加符号指向错误的方向:
它没有帮助这不是脚本中的问题,如果您尝试显式打开硬编码文件名“/home/jddancks/Documents/perl/homeworks/hw13/grades4.txt”,会出现什么错误?(例如,
print“got error$!(“($!+0)。”)\n“
)I got:got error没有这样的文件或目录(2)。我最近甚至尝试在我的机器(debian)上安装suExec。没有帮助。我知道这个文件确实存在。可能是某种奇怪的损坏导致的吗?似乎是cgi脚本运行在与您预期不同的服务器上,或者是chroot没有暴露整个文件系统。在脚本中,尝试打印
join(“,”、glob(“/*”)和glob(“/home/*”)
以查看其中的内容。我呃。。。追加符号指向错误的方向: