Архивирование файлов через shell_exec в PHP: проблема с путями - PullRequest
1 голос
/ 05 мая 2009

Я работаю над службой веб-резервного копирования, часть которой позволяет пользователю загружать zip-файл, содержащий файлы, которые он выбрал, из списка резервных копий.

Процесс архивирования выполняется с помощью команды shell_exec. Для того, чтобы это работало, я дал команде sup привилегии sudo без пароля для пользователя zip.

Моя проблема в том, что я не могу сделать "sudo cd / path / to / user / files" для папки, содержащей файлы резервной копии пользователя, мне нужно указать полный абсолютный путь к файлам, которые будут заархивированы, которые затем зайдите в почтовый файл, который я не хочу.

Вот что я имею в виду:

Пользователь 'test1' имеет свои резервные копии файлов, которые хранятся следующим образом
/ home / резервные копии / test1 / мои фото / pic1.jpg
/ home / резервные копии / test1 / мои фото / pic2.jpg
/ home / резервные копии / test1 / мои фото / pic3.jpg
/home/backups/test1/hello.txt
/home/backups/test1/music/band/song.mp3

Когда эти файлы заархивированы, они сохраняют полный путь, но я просто хочу, чтобы он показывал:
мои фото / pic1.jpg
мои фото / pic2.jpg
мои фото / pic3.jpg
hello.txt
музыка / группа / Song.mp3

Есть ли какой-нибудь способ указать zip обрезать пути или указать собственный путь для каждого файла?
Или есть какой-то способ изменить рабочий каталог на корневую резервную папку пользователя, чтобы я мог просто указать относительные пути к файлам.

Спасибо за чтение, надеюсь, вы зашли так далеко, и все это имеет смысл!

Ответы [ 4 ]

2 голосов
/ 05 мая 2009

Мне нужно немного спросить, почему вы делаете потенциально опасный вызов системной оболочки, когда вокруг множество хороших PHP-классов. В руководстве здесь показано, как легко создать класс, который будет выводить zip-файл в браузер. На phpclasses.org также есть несколько классов, , кажется, самый лучший .

Если у вас есть , чтобы сделать это с помощью системного вызова, мои предложения:

Для сокращения пути к файлу вы можете использовать символические ссылки .

Не можете ли вы увеличить разрешения для исполняемого файла zip, чтобы означать, что apache может использовать его без использования sudo?

1 голос
/ 07 мая 2009

Лучшей идеей может быть создание сценария оболочки и предоставление веб-серверу sudo доступа к этому сценарию оболочки. Это также может быть более безопасным

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

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

Также рассматривали ли вы запуск sudo от имени пользователя, с которым вы пытаетесь архивировать файлы, а не от имени пользователя root? Это также было бы более безопасно.

1 голос
/ 05 мая 2009

Вы пытались использовать chdir() для изменения рабочего каталога?

chdir('/home/backups/test1/');
0 голосов
/ 05 мая 2009

Кажется, это простой вариант, но согласно man его просто нет. Вы, конечно, можете сделать символическую ссылку на материал, который вы хотите заархивировать в месте, где вы создадите zip-файл (я полагаю, что вы действительно можете перейти в этот каталог). При правильных параметрах zip не будет архивировать сами символические ссылки, а вместо них - файлы с символическими ссылками, используя имена символических ссылок.

например. создайте символические ссылки / tmp / $ PID / мои фото / pic1.jpg и т. д., а затем заархивируйте все в /tmp/$PID.

...