2009-05-05 9 views
1

私は、バックアップしたもののリストから、選択したファイルを含むzipファイルをダウンロードできるWebバックアップサービスの作業を進めています。PHPのshell_execによるファイルの圧縮:パスの問題

zipプロセスは、shell_execコマンドで実行されます。これを動作させるために、私はapacheユーザにzipコマンドに対するno-password sudo権限を与えました。

私の問題は、ユーザーのバックアップファイルが格納されているフォルダに "sudo cd/path/to/user/files"を実行できないためです。圧縮するファイルへの完全な絶対パスを指定する必要があります。私が望んでいないzipファイルに入ります。

は、ここで私が何を意味するかです:

ユーザー、 'test1のは、' 自分のファイルが
/ホーム/バックアップ/ test1の/私の写真/ pic1.jpg
/ホーム/バックアップを次のように保存されているバックアップしています/ test1の/私の写真/ pic2.jpg
/ホーム/バックアップ/ test1の/私の写真/ pic3.jpg

/ホーム/バックアップ/ test1の/音楽/バンド/歌/home/backups/test1/hello.txt .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

+0

ああ、それほど良いことではない:( – Greg

0

これは単純なオプションのように思えるが、manによると、それはそこだけではありません。もちろん、zipファイルを作成する場所にアーカイブしたいものをシンボリックリンクすることもできます(実際にそのディレクトリにcdできると仮定します)。適切なオプションを指定すると、zipは、シンボリックリンクの名前を使用して、シンボリックリンク自体をアーカイブするのではなく、シンボリックリンクされたファイルをアーカイブします。

など。/tmp/$ PID/my pics/pic1.jpgなどのシンボリックリンクを作成し、/ tmp/$ PID内のすべてを圧縮してください。

2

多くの良いPHP圧縮クラスがある場合、なぜ危険なシステムシェル呼び出しをしているのか、少し質問する必要があります。 tutorial hereは、zipファイルをブラウザに出力するクラスを簡単に作成する方法を示しています。また、phpclasses.orgには多くのクラスがあります。this seems to be the best one

あなたは私の提案がされている呼び出しシステムでそれを行うにはを持っている場合:

は、あなたがsymbolic linksを使用することができ、ファイルのパスを切り捨てるには。

zip実行ファイルのアクセス権を増やすことはできません。これは、sudoを使用せずにApacheが使用できることを意味しますか?

1

もっと良いアイデアは、シェルスクリプトを作成し、そのシェルスクリプトへのWebサーバーのsudoアクセスを許可することです。これは、あまりにも

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

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

はまた、あなたはあなたに、代わりのルートとしてファイルを圧縮しようとしているユーザでsudoを実行していると考えられてきた、より安全かもしれ?これはより安全です。