Могу ли я извлечь архив tar с перезаписью, сохранив права собственности на оригинальные файлы назначения?

Вопрос или проблема

У меня есть особый случай, когда я хочу извлечь архив 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, он по умолчанию восстанавливает исходные метаданные файлов, включая владельца и права доступа, что может привести к изменению прав на целевой файл на те, которые были при его архивировании, а не сохранять оригинальные.

Возможные решения

  1. Использование временных файлов:
    Вы можете распаковать архив во временную директорию, а затем вручную перенести файлы обратно в целевую директорию, установив их владельца и права доступа, как вам необходимо. Примерный алгоритм:

    # Создаем временную директорию
    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/*
  2. Использование --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 может быть эффективным и практичным способом решения вашей задачи. Не забудьте тестировать и адаптировать приведенные команды под ваши конкретные требования и окружение.

Оцените материал
Добавить комментарий

Капча загружается...