2014-01-07 59 views
1

我正在尝试使用perl CGI获取nginx日志文件的实时尾部。 我已经给文件权限是644 我的Perl CGI代码如下:无法通过perl文件读取文件::尾部

#!/usr/bin/perl 
use CGI; 
use File::Tail; 

print "Content-type: text/html\n\n"; 

$| = 1; #set auto flush on 

# param for specifying number of lines to tail. 
#$n = CGI::param('n'); 
$n = '20'; 
$file_name = "/var/log/nginx/access.log"; 

#show 100 lines by default 
$tail = $n?$n:100; 

# specifying default as of now 
$file_name = $file_name?$file_name:"$file_name"; 

# tail -n <tail_lines>. Start with tail_lines 
$tail_lines=10; 

$tail_file=File::Tail->new(name=>$file_name, 
          maxinterval=>2, 
          adjustafter=>1, 
          maxbuf=>16384, 
          tail=>$tail_lines); 


while (defined($readline=$tail_file->read)) 
{ 
    print $readline."</br>"; 
} 

我已经获准如下

-RW-R - R--。 1 nginx的nginx的32565 01月07日17:17 /var/log/nginx/access.log

,我面临这样的问题,只有tailf ..............

在nginx日志中相关的权限

[Tue Jan 07 17:16:07 2014] [error] [client 127.0.0.1] Error opening /var/log/nginx/access.log: Permission denied at /var/www/cgi-bin/clarity.pl line 32, referer: http://host:8888/clarity.html 

帮我解决这个问题...?

+1

根据您系统上的'grep',正如您所做的那样使用'-r'会引起一点疯狂,因为它会递归地查看httpd工作目录。我的意思不是听起来很刺耳,但你的剧本有点可怕。您可能希望谷歌“perl消毒CGI输入”,以及调查为什么你真的不想将任何东西传递给shell。考虑在Perl脚本中打开并阅读日志,而不是去掉cat/grep,并使用一个经过清理的'\ Q $ test \ E'匹配表达式来执行你的grepping。上帝的速度! – codnodder

+0

@codnodder但我只面对尾部问题。 – user2916639

+0

这只是一个权限问题。如果您从日志文件中检查文件夹的权限,则会发现Web服务器进程无法读取该文件夹的权限。 – codnodder

回答

0

你是否设置了一些让perl CGI脚本作为单独用户运行的东西?

通常,大多数现代的nginx安装都有以不同用户身份执行的脚本。这样,如果有人侵入你的CGI脚本,他们不会轻易影响实际的Web服务器进程。

你可以尝试像

print "real uid: $<, effective uid: $>\n"; 

在一个单独的CGI脚本来测试你的脚本实际运行哪些用户的。