Назад | Перейти на главную страницу

tar - своп владельцев при переносе файлов с dev на prod server

На сервере Dev у нас есть дерево файлов, принадлежащих пользователю webdev или webserv.

Я хотел бы запечатать это дерево файлов и извлечь его на производственный сервер, с изменением что любые файлы, принадлежащие "webdev", теперь будут принадлежать "webprod", а любые файлы, принадлежащие webserv, будут оставаться принадлежит webserv.

Есть ли способ сделать такую ​​"подкачку"?

Вы можете сделать это наиболее эффективно, используя find после распаковки архива:

# find /path -user webdev -exec chown webprod '{}' +

Я думаю, вы могли бы сделать что-нибудь умное с --to-command вариант в последних версиях GNU tar (около 1.25), чтобы справиться с этим. Это должно позволить вам выполнять произвольные преобразования вывода tar-файла, пропуская его через специальную программу фильтрации. Теоретически можно было бы проверить владельца каждого извлекаемого из архива файла и при необходимости изменить его.

Однако в настоящее время в сети нет хороших примеров того, как использовать эту функциональность, и мои попытки создать сценарий фильтрации оказались бесплодными.

Затем меня осенило, что эту дилемму можно решить, разделив архив на два отдельных файла. Это можно сделать с помощью tar, но лучше всего с этим справляется cpio, потому что cpio имеет более гибкую обработку ввода.

Итак, вот моя попытка решения с использованием find и cpio. Сначала создайте cpio-архив всех файлов, принадлежащих Webserv:

cd /var/www && find . -owner webserv | cpio -ov --format=crc | gzcat webserv-files.cpio.gz

затем создайте cpio-архив файлов, принадлежащих веб-разработчик, меняя владельца на webprod:

cd /var/www && find . -owner webdev | cpio -ov --format crc --owner webprod | gzcat webdev-files.cpio.gz

(обратите внимание, что это будет работать только при запуске от имени root в соответствии с man-страницей cpio).

Теперь в пункте назначения распакуйте оба архива:

cd /var/www
gzcat webserv-files.cpio.gz | cpio -iv
gzcat webdev-files.gpio.gz | cpio -iv

Я думаю, что это приведет к желаемому результату, хотя я не тестировал слишком тщательно.

Если webprod запускает команду tar, файлы будут принадлежать webprod. Возможно, файлы в tar-файле должны быть доступны для чтения webprod.

В большинстве случаев этот веб-продукт не должен быть идентификатором пользователя, от имени которого работает веб-сервер. Это ограничит возможность изменения вашего контента путем компрометации веб-сервера.