14 12
发新话题
打印

请问用perl怎样创建一个文件?

Re: Re: Re: 不会吧,我都测试过这样可以

[QUOTE]最初由 catinpeking 发布
[B]
为什么创建之后的文件会不能读呢?你对那个目录的权限是什么? [/B][/QUOTE]

是这样的,我要用perl写个cgi程序,用户通过web页查询我的一个记录日志,因此我创建的这个文件$dir_tmpfile要能读能写!!我写单独的程序用root身份试用你上面的那些都是正确的,可是我把这些代码用到我的CGI程序中就不行了!
我也知道这是一个权限的问题,可是不知道如何解决!我现在只好强行规定那两个文件都存在在相应的目录下,并且设定了相应的读写权限!我在CGI程序中用chmod改变权限不管用啊!      
忘了谁也不能忘了你--我的草莓!

TOP

我把我写的程序贴出来吧!

[root@www cgi-bin]# vi listlog.pl

#!/usr/bin/perl
#2003-04-02:15-35-00
#------------------------------------------------------
#this Script file is used to
#response the admin's query from filelog;
#the file's head lines can be palced by 'sub head' at end;
#requery log file "admin.log" and You can defined them youself;
$dir_logfile = "../log/admin.log";  #mod 0444
$dir_tmpfile = "$dir_logfile".'.tmp';  #mod 0666
#------------------------------------------------------

push(@INC, '.');
use CGI;

$query = new CGI();
print "Content-type:text/html\n\n";

#logfile format
#Yyyy-mm-dd:hh-ss-mm domain admin ip logstring
%logStruct = (
        "yyyy" , "2003",
        "mm"   , "01",
        "dd"   , "01",
        "hh"   , "00",
        "ss"   , "00",
        "mmmm"   , "00",
        "domain"   , "www.orizone1.com" ,
        "admin"    , "admin1",
        "ip"       , "202.103.44.5",
        "logstring", "AVDFGGHKGJKJHGLGJLKJG)GKL_FHJLKFO"
);

#Struct get from client;
#Yyyyy-mm-dd domain admin oktype
%postStruct = (
        "yyyy" , "2003",
        "mm"   , "12",
        "dd"   , "31",
        "date" , '2003-12-31',
        "domain"   , "www.orizone.com",
        "admin"    , "admin1",
        "oktype"   , 'ok.date'
);

#Get the detail info of %postStruct;
   if ( defined $query->param("ok.date") ) {
        $postStruct{"oktype"}='ok.date';
        if ( defined $query->param("yyyy")
          && defined $query->param("mm")
          && defined $query->param("dd") ) {
                $postStruct{"yyyy"}=$query->param("yyyy");
                $postStruct{"mm"}=$query->param("mm");
                $postStruct{"dd"}=$query->param("dd");
                $postStruct{"date"}=$postStruct{"yyyy"}."-".$postStruct{"mm"}."-".$postStruct{"dd"};
        }
   }elsif ( defined $query->param("ok.domain") ) {
        $postStruct{"oktype"}='ok.domain';
        $postStruct{"domain"}=$query->param("domain");
   }
   else {
        if ( defined $query->param("ok.admin") ) {
                $postStruct{"oktype"}='ok.admin';
                $postStruct{"admin"}=$query->param("admin");
        }
   }

#whether the logfile exists
if ((-e $dir_logfile) == 0) {
        &out_err("sorry,\t","The logfile is not exists!");
}elsif ((-r $dir_logfile) ==0) {
        &out_err("sorry,\t","Can not read the logfile!");
}else {

#Body Begin
if ($postStruct{"oktype"} eq 'ok.date') {
        if ( length($postStruct{"yyyy"}) == 4 && $postStruct{"yyyy"} =~ /[12]\d\d\d/) {
                &getlog_date;
                &out_date("Result: \t","Query by date $postStruct{\"date\"}");
        }else {
                &out_err("sorry,\t","enter date error!");
        }
}elsif ($postStruct{"oktype"} eq 'ok.domain') {
        if ($postStruct{"domain"} =~ /\./) {
                &getlog_domain;
                &out_date("Result: \t","Query by domain $postStruct{\"domain\"}");
        }else {
                &out_err("sorry,\t","enter domain error!");
        }
}elsif ($postStruct{"oktype"} eq 'ok.admin') {
        if ($postStruct{"admin"} =~ /./) {
                &getlog_admin;
                &out_date("Result: \t","Query by admin $postStruct{\"admin\"}");
        }else {
                &out_err("sorry,\t","enter admin error!");
        }
}else {
        &out_err("Sorry,","have a noknown error!!!");
}
#Body End;
}

#html => ok.date;
#=======================HTML====================================
sub out_date
{
print <<__EOF__;
<html>
  <head>
    <title>Rockmail system administrator -Query by Date</title>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
  </head>
  <body bgcolor="#FFFFFF" text="#000000" background="images/bg.gif" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">
  <table align=center><tr><td align=center>
__EOF__
  $info = shift;
  $result = shift;
  print $info,$result,"\n";
print <<__EOF__;
  </td></tr>
__EOF__
#display the patched log
&displayForm;
print <<__EOF__;
  <br><br><br>
  <tr><td align=center>
  </td></tr><tr><td align=center>
  <a href="http://10.0.0.100/listlog.htm"><b>ruturn</b></a>
  </td></tr></table>
  </body>
</html>
__EOF__
}


#html => ok.domain;
#=====================HTML======================================
sub out_domain
{
print <<__EOF__;
<html>
  <head>
    <title>Rockmail system administrator -Query by Domain</title>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
  </head>
  <body bgcolor="#FFFFFF" text="#000000" background="images/bg.gif" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">
  <table align=center><tr><td align=center>
__EOF__
  $info = shift;
  $result = shift;
  print $info,$result,"\n";
print <<__EOF__;
  </td></tr>
__EOF__
#display the patched log
&displayForm;
print <<__EOF__;
<br><br><br>
  <tr><td align=center>
  </td></tr><tr><td align=center>
  <a href="http://10.0.0.100/listlog.htm"><b>ruturn</b></a>
  </td></tr></table>
  </body>
</html>
__EOF__
}


#html => ok.admin
#========================HTML===================================
sub out_admin
{
print <<__EOF__;
<html>
  <head>
    <title>Rockmail system administrator -Query by Admin</title>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
  </head>
  <body bgcolor="#FFFFFF" text="#000000" background="images/bg.gif" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">
  <table align=center><tr><td align=center>
__EOF__
  $info = shift;
  $result = shift;
  print $info,$result,"\n";
print <<__EOF__;
  </td></tr>
__EOF__
#display the patched log
&displayForm;
print <<__EOF__;
<br><br><br>
  <tr><td align=center>
  </td></tr><tr><td align=center>
  <a href="http://10.0.0.100/listlog.htm"><b>ruturn</b></a>
  </td></tr></table>
  </body>
</html>
__EOF__
}


#html => error;
#========================HTML===================================
sub out_err
{
print <<__EOF__;
<html>
  <head>
    <title>Rockmail system administrator -Query Error</title>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
  </head>
  <body bgcolor="#FFFFFF" text="#000000" background="images/bg.gif" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">
  <table align=center><tr><td align=center>
__EOF__
  $info = shift;
  $result = shift;
  print $info,$result,"\n";
print <<__EOF__;
  </td></tr>
  <br><br><br>
  <tr><td align=center>
  </td></tr><tr><td align=center>
  <a href="http://10.0.0.100/listlog.htm"><b>ruturn</b></a>
  </td></tr></table>
  </body>
</html>
__EOF__
}

#display the patched loglines
#called by out_*
#-----------------------SUB--------------------------------------
sub displayForm
{
  open(MYFILE,"$dir_tmpfile");
  @lines = <MYFILE>;
  close(MYFILE);

print <<__EOF__;
  <tr><td align=center>
  <table border align=center>
  <tr><th>Date</th><th>Time</th><th>Domain</th><th>Admin</th><th>IP</th><th>Log</th>
__EOF__
  foreach $line(@lines){
print <<__EOF__;
  <tr>
__EOF__

  @info = split(/ /,$line);
  my $i=0;
  foreach $logi(@info) {
        $i++;
        if ($i <= 1) {
                ($logdate,$logtime) = split(/:/,$logi);
print <<__EOF__;
                <td>
__EOF__
                print $logdate;
print <<__EOF__;
                </td>
                <td>
__EOF__
                print $logtime;
print <<__EOF__;
                 </td>
__EOF__
        } else {
print <<__EOF__;
                <td>
__EOF__
                print $logi;
print <<__EOF__;
                </td>
__EOF__
        }
  }
  }
print <<__EOF__;
  </table></td></tr>
__EOF__
}

#copy patched logs from logfile to tmpfile => ok.date;
#------------------------SUB-------------------------------------
sub getlog_date
{
        open (MYFILE, "$dir_logfile") || die ("Could not open file");
        @lines = <MYFILE>;
        close(MYFILE);
        &empty_tmpfile;

        foreach $line (@lines) {
                @info = split(/ /,$line);
                ($logdate,$logtime) = split(/:/,$info[0]);
                if ($logdate eq $postStruct{"date"}) {
                        &addline_tmpfile("$line");
                }
        }
}


#copy patched logs from logfile to tmpfile => ok.domain;
#-------------------------SUB------------------------------------
sub getlog_domain
{
        open (MYFILE, "$dir_logfile") || die ("Could not open file");
        @lines = <MYFILE>;
        close(MYFILE);
        &empty_tmpfile;

        foreach $line (@lines) {
                @info = split(/ /,$line);
                $logdomain = $info[1];
                if ($logdomain eq $postStruct{"domain"}) {
                        &addline_tmpfile("$line");
                }
        }
}


#copy patched logs from logfile to tmpfile => ok.admin;
#--------------------------SUB-----------------------------------
sub getlog_admin
{
        open (MYFILE, "$dir_logfile") || die ("Could not open file");
        @lines = <MYFILE>;
        close(MYFILE);
        &empty_tmpfile;

        foreach $line (@lines) {
                @info = split(/ /,$line);
                $logadmin = $info[2];
                if ($logadmin eq $postStruct{"admin"}) {
                        &addline_tmpfile("$line");
                }
        }
}


#empty the tmpfile;
#called by getlog_date, getlog_domain, getlog_admin
#-------------------------SUB------------------------------------
sub empty_tmpfile
{
        open(OUTFILE, ">$dir_tmpfile");
        print OUTFILE ("");
        close(OUTFILE);
#       chmod 0666,$dir_tmpfile;
}


#add new line to tmpfile;
#called by getlog_date, getlog_domain, getlog_admin
#-------------------------SUB------------------------------------
sub addline_tmpfile
{
        ($addline) = @_;
        open(OUTFILE, ">>$dir_tmpfile");
#       seek (OUTFILE, 0, 2);
        print OUTFILE ("$addline");
        close(OUTFILE);
}





就是这两个函数中涉及到访问文件的权限问题:

#empty the tmpfile;
#called by getlog_date, getlog_domain, getlog_admin
#-------------------------SUB------------------------------------
sub empty_tmpfile
{
        open(OUTFILE, ">$dir_tmpfile");   #程序好像没有执行这个,因为我的$dir_tmpfile不存在的话根本没有创建。
        print OUTFILE ("");
        close(OUTFILE);
#       chmod 0666,$dir_tmpfile;   
#我在程序执行前手工创建了$dir_tmpfile后,程序执行到这里没有改变其权限!
}


#display the patched loglines
#called by out_*
#-----------------------SUB--------------------------------------
sub displayForm
{
  open(MYFILE,"$dir_tmpfile");  
#这里要读取$dir_tmpfile,可是empty_tmpfile没有创建这个文件。
  @lines = <MYFILE>;
  close(MYFILE);
。。。。。。。。。。。。。。
}      
忘了谁也不能忘了你--我的草莓!

TOP

cgi编程我不了解(从图书馆借了本书,但到现在都没看过)。
或许你可以去这里看看:
http://www.perlchina.com
这是中国perl协会的论坛。      

TOP

[QUOTE]最初由 catinpeking 发布
[B]cgi编程我不了解(从图书馆借了本书,但到现在都没看过)。
或许你可以去这里看看:
http://www.perlchina.com
这是中国perl协会的论坛。 [/B][/QUOTE]谢谢你!      
忘了谁也不能忘了你--我的草莓!

TOP

 14 12
发新话题