PHP shell_exec yoluyla dosya sıkıştırma: yolları ile sorun

4 Cevap php

Ben kullanıcı onlar yedeklenen ne bir listeden seçmiş dosyalarını içeren zip dosyasını indirmek için izin veren bir web yedekleme servis bölümünde çalışıyorum.

Sıkıştırma işlemi shell_exec komutu ile yapılır. Bu çalışması için ben zip komuta apache kullanıcıya hiç parola sudo ayrıcalıklarına verdik.

Benim sorunum ben o zaman gitmek sıkıştırılmış edilecek dosyaları tam yol belirtmeniz gerekir kullanıcının yedeklenen dosyaları içeren klasöre "sudo cd / yol / / kullanıcı / files" yapamaz beri, Ben istemiyorum zip dosyası.

İşte ne demek istediğimi:

The user, 'test1' has their files backed up which are stored as follows
/home/backups/test1/my pics/pic1.jpg
/home/backups/test1/my pics/pic2.jpg
/home/backups/test1/my pics/pic3.jpg
/home/backups/test1/hello.txt
/home/backups/test1/music/band/song.mp3

When these files are zipped up they keep the full paths but I just want it to show:
my pics/pic1.jpg
my pics/pic2.jpg
my pics/pic3.jpg
hello.txt
music/band/song.mp3

Is there some way to tell zip to truncate the paths, or specify a custom path for each file?
Or is there some way I can change the working directory to the user's root backup folder so I can simply specify relative file paths.

Okuduğunuz için teşekkürler, eğer bu kadar var ve tüm mantıklı umut!

4 Cevap

Ben iyi bir PHP vızıltının sınıfları bir dizi etrafında varken, tehlikeli sistem kabuk çağrı yapıyoruz, neden biraz soru var. Burada öğretici: http://www.granthinkson.com/2005/07/01/create-zip-files-dynamically-using-php/ kolayca tarayıcıya çıktı bir zip dosyası olacak bir sınıf oluşturmak için nasıl gösterir. Phpclasses.org sınıfların bir dizi de var, bu iyi biri gibi görünüyor: http://www.phpclasses.org/browse/package/2322.html.

Eğer have dediğimiz bir sistem ile bunu yapmak için eğer benim öneri:

Yolunu kesecek şekilde dosyası için sembolik bağlantıları kullanabilirsiniz - Bkz: http://en.wikipedia.org/wiki/Ln_ (Unix).

O apache sudo kullanmadan kullanabilirsiniz demek zip yürütülebilir izinlerini artırmak değil mi?

Daha iyi bir fikir, bir kabuk komut dosyası yapmak olabilir ve bu kabuk için web sunucusu sudo erişim verebilir. Bu da, daha güvenli olabilir

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

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

Ayrıca siz zip dosyaları için çalışıyoruz kullanıcı olarak sudo çalışan, yerine kök olarak kabul var? Bu aynı zamanda daha güvenli olacaktır.

Basit bir seçenek gibi görünüyor, ama göre man orada sadece değil. Siz tabii ki (ben bu dizinin aslında cd can varsayıyorum) Eğer zip dosyası oluşturmak olacak konumda arşivlemek istediğiniz şeyler sembolik bir link olabilir. Uygun seçenekleri ile zip Bir sembolik adlarını kullanarak, yerine sembolik kendilerini ancak sembolik olarak arşiv dosyaları olmaz.

Örneğin sonra oluşturmak symlinks / tmp / $ PID / benim pics/pic1.jpg etc ve / tmp / $ PID herşeyi zip.