2013-04-09 50 views
2

我廣泛搜查擁有文件,但沒有找到任何具體的這個樣子。拒絕了對用戶使用Perl和cron

我有一個目錄還擁有和可寫的「阿帕奇」,「阿帕奇」所擁有的日誌文件,並寫入:

-rw-rw-r-- 1 apache apache 0 Apr 9 16:43 /var/log/apache2/load.log 

我有一個Perl程序「load.pl」有以下幾點:

my $log = "/var/log/apache2/load.log"; 
my $error = ""; 

#...doing useful stuff here, where $error might get set 

if ($error && $log) 
{ 
    if (open (LOG, '>>$log')) 
    { 
      print LOG "[".localtime(time)."] ".$error."\n"; 
      close (LOG); 
    } 
    else 
    { 
      my $reason = $!; 
      $error .= "Could not open log file as ".getpwuid($>)." (really ".getpwuid($<)."): $reason"; 

      my $subject = "load.pl could not write to $log"; 
      $error .= email($mailto, $replyto, $subject, $error); 
    } 
} 

其中$ mailto,$ replyto和email()子程序被定義並正常工作。

我可以通過crontab運行此程序如下:

*/1 * * * *  apache flock -x -w 10 /home/web/load.txt -c "perl /home/web/load.pl> /home/web/load.txt 2>&1" 

Load.txt得到STDOUT,這是JSON格式的一些網站負載統計被從JavaScript調用,而任何捕獲錯誤的應該是寫入load.log。一切工作正常,除了日誌寫作。

我通過電子郵件獲取以下輸出...

Subject: load.pl could not write to /var/log/apache2/load.log 
Could not open log file as apache (really apache): Permission denied 

所以很明顯Perl是執行這個程序爲「阿帕奇」 - 既有效又實際UID。但是我在apache所擁有的目錄中獲得了apache擁有的文件的權限。

+0

是,如果你執行腳本直,用戶的Apache,而不是通過cron的工作? – fedorqui 2013-04-09 22:43:45

+0

好問題!上面的cron部分可能是多餘的信息,因爲如果我運行'sudo -u apache load.pl',會發生同樣的事情。 – Tom 2013-04-09 23:18:26

+0

以超級用戶身份運行也不起作用,但不是權限被拒絕,而是說:「無法以超級用戶身份打開日誌文件(真正的超級用戶):不適合設備的ioctl。這種「對設備不適當的ioctl」實際上是不開放的,但在打印。 – Tom 2013-04-09 23:22:50

回答

5

使用單引號不會擴大變量:

if (open (LOG, '>>$log')) 

使用雙引號來代替。

+0

愚蠢,愚蠢的我!我實際上想到了這一點,併發布解決方案,並發現你擊敗了我。這就是我懶得從別處複製代碼塊而沒有意識到我用變量替換了硬編碼的文件名。你不會相信這讓我難過多久。我無法弄清楚*權限*問題,因爲它與權限無關。希望這會幫助別人更快地認識到這一點。 – Tom 2013-04-09 23:38:59

1

兩件事嘗試:

lsattr /var/log/apache2/load.log 

這將檢查你的日誌外商投資企業的擴展atributes。其中一個屬性是不可變的,它使您的文件只讀取用戶權限。

ls -Z /var/log/apache2/load.log 

這將顯示SELinux上下文和僅適用於基於紅帽/強化Gentoo發行相關(在這種情況下,你也應該受到更多的錯誤和警告在您的系統日誌)