“软件错误:文件错误,权限被拒绝”。如何解决这个错误?

时间:2016-10-29 21:59:32

标签: html perl cgi

这个perl程序几乎显示了cgi脚本,但它在页面底部有这个注释

软件错误:文件错误,/Applications/XAMPP/xamppfiles/cgi-bin/asst5/orderbolts.cgi第34行的权限被拒绝。

来自cgi的第34行是:

open (ORDERS, ">>bolts.txt") or die "File error, $!";

这是html文件

<!doctype html>
<html lang="en">
<body>

<form action="/cgi-bin/asst5/orderbolts.cgi" method="post">
<table border="2" cellspacing="5" cellpadding="5">
<tr>
   <td align="center">Name : </td>
   <td><input type="text" name="customer" size="15"></td>
</tr>
<tr>
   <td align="center">Street : </td>
   <td><input type="text" name="street" size="15"></td>
</tr>
<tr>
   <td align="center">City : </td>
   <td><input type="text" name="city" size="15"></td>
</tr>
<tr>
   <td align="center">State : </td>
   <td><input type="text" name="state" size="3"></td>
</tr>
<tr>
   <td align="center">Zip : </td>
   <td><input type="text" name="zip" size="6"></td>
</tr>
<tr>
   <td align="center"># of bolts : </td>
   <td><input type="text" name="qty" size="4"></td>
</tr>
<tr>
   <td colspan="2" align="center"><input type="submit" value="Check Out"></td>
</tr>
</table>
</form>
</div>
</body>
</html>

这是CGI文件

#!/usr/bin/perl -w

use CGI qw(:standard);
use CGI::Carp qw(fatalsToBrowser);
use strict;
use warnings;
print "Content-type: text/html\n\n";

my $cust = param('customer');
my $addr = param('street');
my $city = param('city');
my $state = param('state');
my $zip = param('zip');
my $qty = param('qty');
my $pay = sprintf("\$%.2f", $qty * 0.95);

print <<HERE;
<HTML>
<BODY>
<H3>Here is your order...please check</H3>
$cust<br>
$addr<br>
$city , $state $zip<br>
Number of bolts ordered : $qty<br>
Total bill for order : $pay<br><br>
<i><b>Thanks for shopping at Brad's</b></i>
HERE

open (ORDERS, ">>bolts.txt") or die "File error, $!";
print ORDERS "$cust|$addr|$city|$state|$zip|$qty|$pay\n";
close ORDERS;

3 个答案:

答案 0 :(得分:0)

使用filename.ext查找文件。授予它可能想要在终端中使用它访问它的软件的访问权限:

sudo chmod 777 filename.ext

值得仔细阅读chmod在这里做了什么。但这可能会解决你的问题。

答案 1 :(得分:0)

TL;博士

提供bolts.txt的完整路径,并使该路径可供Apache用户使用(例如www-data)。

这里要考虑两件事:

  1. 您尝试打开文件bolts.txt以进行追加,但不提供完全限定的路径名​​,例如/path/to/bolts.txt。在这种情况下,当Apache执行.cgi脚本时,将搜索相对于当前工作目录($ CWD)的文件。我不确定它是否可预测或记录了当Apache执行cgi-bin脚本时$ CWD是什么。 可能是.cgi脚本所在的目录,它也可能是Apache自己的bin目录(如/usr/sbin/)甚至是其他东西。要解决这种不确定性,请始终提供相对于.cgi脚本的/full/path/to/bolts.txt或路径。核心模块FindBin非常适合:

    use FindBin;
    ...
    open (ORDERS, '>>', "$FindBin::Bin/../../data/bolts.txt")
    

    $FindBin::Bin包含脚本的路径,在您的情况下,bolts.txt的绝对路径将为/Applications/XAMPP/xamppfiles/data/bolts.txt

  2. 您的.cgi脚本由您的网络服务器(apache)执行,因此以用户www-runwwwwww-data或类似的方式运行,具体取决于您的操作系统和/或分发。就我而言(Ubuntu)apache以用户www-data运行。一旦确定了bolts.txt实际所在的位置,就必须确保用户www-data有权在该目录中写入并写入该文件。对于上面的示例,必要的命令可以是:

    chown www-data /Applications/XAMPP/xamppfiles/data  # ¹
    chmod 755 /Applications/XAMPP/xamppfiles/data       # ²
    chmod -R u+w /Applications/XAMPP/xamppfiles/data/*  # ³
    

    ¹使www-data成为该目录的所有者 ²使其可写为www-data
    ³使其中的所有文件也可写为www-data

答案 2 :(得分:-2)

更新:我的工作现在。我做的事情是:

  1. 我更改了分享&amp;阅读和阅读权限为所有文件写
  2. chmod 765