2014-03-13 41 views
2

我使用的是Ubuntu服務器,我有一個cgi-bin腳本來執行以下操作。 。 。Cgi-bin腳本來捕捉用戶擁有的文件

#!/bin/bash 
echo Content-type: text/plain 
echo "" 
cat /home/user/.program/logs/file.log | tail -400 | col -b > /tmp/o.txt 
cat /tmp/o.txt 

現在,如果我運行此腳本與我「蘇」的劇本充滿o.txt然後host.com/cgi-bin/script運行,但最多隻會顯示最後我跑了從點CLI

我的apache錯誤日誌顯示「權限被拒絕」錯誤。所以我知道用戶apache在某種程度上運行不了這個文件。我嘗試使用chown無濟於事。由於此文件位於用戶目錄中,因此將其複製或符號鏈接它或什麼的最佳方法是什麼?

我甚至認爲在crontab中以root身份運行腳本以排序「更新」/ tmp /中的文件,但這對我不起作用。有人經歷過cgi-bin會如何處理對用戶目錄中文件的訪問?

+0

運行'tail -n 400 logfile | sudo -u www-data tee /var/www/tail.txt>/dev/null'每分鐘一次將首先避免需要CGI腳本。 – tripleee

回答

3

Apache用戶www-data不具有對其他用戶擁有的臨時文件的寫入權限。

但在這種特殊情況下,不需要臨時文件。

tail -n 400 logfile | col -b 

但是,如果Apache在受限chroot運行,它也有/home沒有訪問。

日誌文件需要爲chmod o+r,所有通往它的目錄應該是chmod o+x。確保你明白這一點的含義!如果用戶有理由想要阻止訪問中間目錄,那麼擁有對文件本身的讀取權限是不夠的。 (從理論上說,製作一些擁有www-data作爲其所有者的東西是可能的,但是不切實際和毫無意義,因爲任何發現CGI腳本的人都可以訪問該文件。)

更一般地,如果您確實需要臨時文件,簡單的修復(甚至不是解決方法)是生成一個唯一的臨時文件名,然後將其刪除。

temp=$(mktemp -t cgi.XXXXXXXX) || exit $? 
trap 'rm -f "$temp"' 0 
trap 'exit 127' 1 2 15 

tail -n 400 logfile | col -b >"$temp" 

第一個trap確保腳本終止時文件被刪除。第二個確保在腳本被中斷或死亡時運行第一個trap

+0

我試過只用尾巴,這裏是我的apache錯誤日誌中的新錯誤 tail:無法打開'/home/user/.program/log'進行閱讀:權限被拒絕 – Matt3324

+0

'trap'中的信號編號應該恰當地是象徵性的。太老,懶得去看他們。 EXIT和... HUP和INT的東西,我猜? – tripleee

+0

用戶是否知道並同意這一點?然後獲得授予權限和/或文件移動到更易於訪問的位置應該是一件簡單的事情。 – tripleee

2

我會傾向於更改創建日誌的程序,並將其寫入Apache可見的某個位置 - 可能是通過符號鏈接。

例如:

ln -s /var/www/cgi-bin/logs /home/user/.program/logs 

所以,你的程序將繼續寫入/home/user/.program/logs但數據實際上在/var/www/cgi-bin/logs土地,其中阿帕奇可以讀取它。

+0

如果最終目的地不被允許,Apache也將無法遍歷符號鏈接。否則,獲得訪問被阻止的東西將是微不足道的! – tripleee

+0

Apache不需要使用符號鏈接。 OP的原始程序通過符號鏈接寫入,Apache讀取真實文件。對不起,我有鏈接回到前面。 –

+0

噢,我現在看到( - : – tripleee