2009-05-05 94 views
1

我正在開發一個網絡備份服務的一部分,該部分允許用戶下載一個zip文件,其中包含他們從已備份列表中選擇的文件。通過shell_exec在PHP中壓縮文件:問題與路徑

壓縮過程是通過shell_exec命令完成的。爲了這個工作,我給了zip命令apache用戶無密碼的sudo權限。

我的問題是,因爲我不能對包含用戶備份文件的文件夾執行「sudo cd/path/to/user/files」,我需要指定要壓縮文件的完整絕對路徑,然後進入我不想要的zip文件。

這裏就是我的意思是:

用戶, 'TEST1' 有自己的文件備份其中存儲如下
/家庭/備份/ test1的/我的圖片/ pic1.jpg
/家庭/備份/ TEST1 /我的圖片/ pic2.jpg
/家庭/備份/ test1的/我的圖片/ pic3.jpg
/home/backups/test1/hello.txt
/家庭/備份/ TEST1 /音樂/樂隊/歌曲.mp3

當這些文件被壓縮時,它們保留完整的路徑但我只是想讓它顯示:
我的圖片/ pic1.jpg
我的圖片/ pic2.jpg
我的圖片/ pic3.jpg
hello.txt的
音樂/樂隊/ Song.mp3的

有沒有辦法告訴zip截斷路徑,或爲每個文件指定一個自定義路徑?
或者有什麼方法可以將工作目錄更改爲用戶的根備份文件夾,以便我可以簡單地指定相關文件路徑。

感謝您的閱讀,希望您有這麼遠,這一切都有道理!

回答

1

您是否嘗試過使用chdir()來更改工作目錄?

chdir('/home/backups/test1/'); 
+0

PHP使用apache用戶無法訪問用戶文件的目錄。我使用「sudo zip ...」來執行壓縮,但不能完成「sudo cd/path/to/folder」。 – Nick 2009-05-05 15:15:50

0

這似乎是一個簡單的選擇,但根據man它只是不存在。當然,你可以將要存檔的東西符號鏈接到你要創建zip文件的位置(我假設你實際上可以cd到那個目錄)。使用適當的選項,zip不會將符號鏈接本身存檔,而是將符號鏈接的文件存檔,而使用符號鏈接的名稱。

例如創建符號鏈接/ tmp/$ PID/my pics/pic1.jpg等,然後在/ tmp/$ PID中壓縮所有內容。

2

我不得不稍微質疑爲什麼當有大量很好的PHP壓縮類的時候,你正在做一個有潛在危險的系統shell調用。 tutorial here顯示瞭如何輕鬆創建一個將輸出zip文件到瀏覽器的類。在phpclasses.org上還有很多類,this seems to be the best one

如果一個系統來做,打電話給我的建議是:

要截斷了,你可以使用symbolic links文件的路徑。

難道你不能增加zip可執行文件的權限來表示apache不使用sudo就可以使用它嗎?

1

一個更好的主意可能是創建一個shell腳本,並授予webserver sudo對該shell腳本的訪問權限。這可能是更安全的,因爲

#!/bin/bash 
# 
# Zip up files for a given user 
# 
# usage: backupToZipFile.sh <username> 

cd home/backups/$1 
tar -czf /tmp/$1.tgz . 

也有你認爲運行須藤你盡力zip文件作爲用戶,而不是作爲根?這也會更安全。