2014-01-07 82 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腳本來測試你的腳本實際運行哪些用戶的。