Вопрос или проблема
У меня есть особый случай, когда я хочу извлечь архив tar (как root) и намеренно перезаписать некоторые целевые файлы содержимым архива. Это все вполне нормально и легко достижимо, но я также хочу сохранить оригинальную собственность и права доступа исходных целевых файлов. Например:
$ touch file && tar cf test.tar.gz file &&
sudo chown www-data:www-data file &&
sudo tar xf test.tar.gz && ls -l file
-rw-r--r-- 1 tim tim 0 May 1 11:26 file
Здесь я создаю файл как мой пользователь (tim:tim
), архивирую его, изменяю его собственность на www-data:www-data
, а затем (как root) извлекаю архив, перезаписывая оригинальный файл. Как видите, его собственность была изменена на ту, которая была у файла в его предварительно архивированном состоянии, в то время как после извлечения я хочу, чтобы он принадлежал www-data:www-data
.
Я внимательно изучил страницу man по tar
, но не вижу очевидного способа сделать то, что я хочу. Я что-то упускаю?
Как обычный пользователь, вы не сможете перезаписать файл, принадлежащий www-data, имея только права на запись для владельца, поэтому то, что вы хотите, не сработает в вашем примере.
Что сработает, если вашему пользователю разрешено записывать в эти файлы, так это использовать --overwrite
. Однако вы получите ошибки, когда tar
попытается изменить время изменения и права доступа файла, потому что вы как обычный пользователь не имеете права этого делать с файлами, которые вам не принадлежат.
Ответ или решение
К сожалению, непосредственно сохранить владельца и права доступа исходных файлов при распаковке архива tar с перезаписью невозможно стандартными средствами команды tar
. Однако есть некоторые обходные пути, которые могут удовлетворить вашу задачу.
Проблема: Конфликт владельца и прав доступа
Когда вы распаковываете архив tar, он по умолчанию восстанавливает исходные метаданные файлов, включая владельца и права доступа, что может привести к изменению прав на целевой файл на те, которые были при его архивировании, а не сохранять оригинальные.
Возможные решения
-
Использование временных файлов:
Вы можете распаковать архив во временную директорию, а затем вручную перенести файлы обратно в целевую директорию, установив их владельца и права доступа, как вам необходимо. Примерный алгоритм:# Создаем временную директорию mkdir /tmp/extraction_dir # Извлекаем архив во временную директорию sudo tar xf test.tar.gz -C /tmp/extraction_dir # Копируем файлы обратно, устанавливая владельца sudo cp --preserve=mode,timestamps /tmp/extraction_dir/* /path/to/destination sudo chown www-data:www-data /path/to/destination/*
-
Использование
--overwrite
и исправление прав доступа:
Вы можете использовать параметр--overwrite
для перезаписи файлов, но этот метод потребует последующего изменения владельца и прав доступа:# При помощи tar sudo tar xf test.tar.gz --overwrite # Затем изменить владельца и права доступа sudo chown www-data:www-data /path/to/destination/file sudo chmod 644 /path/to/destination/file
Ограничения
Имейте в виду, что для выполнения указанных выше команд вам нужно будет иметь соответствующие права доступа. Это значит, что вы должны выполнять их с правами суперпользователя (root) или через sudo
.
Альтернативный подход
Если у вас есть возможность использовать другие инструменты для архивации и распаковки, рассмотрите использование rsync
, который может более гибко обрабатывать файлы и директории. Например:
# Извлечение файлов архива с помощью tar, а затем копирование с помощью rsync
sudo tar xf test.tar.gz -C /some/temp/dir
sudo rsync -a --chown=www-data:www-data /some/temp/dir/ /path/to/destination/
Заключение
Таким образом, сохранение оригинальных владельцев и прав доступа при перезаписи файлов при помощи стандартных средств tar
требует дополнительных шагов. Использование временных директорий или комбинация tar
и rsync
может быть эффективным и практичным способом решения вашей задачи. Не забудьте тестировать и адаптировать приведенные команды под ваши конкретные требования и окружение.