сохранение прав доступа к файлу при создании tar-архива с tar-файлом Python

привет стековерфлауэрс,

Я хочу сохранить исходные права доступа к файлам при использовании модуля tarfile Python. У меня есть довольно много исполняемых файлов, которые теряют свои разрешения после извлечения архива.

Я делаю что-то вроде этого:

import tarfile
tar = tarfile.open("mytarball.tar.gz", 'w:gz')
tar.add('my_folder') #tar the entire folder 
tar.close()

Затем я копирую его из Windows на Linux-машину (сопоставленную с samba) с помощью Shutil:

shutil.copy("mytarball.tar.gz",unix_dir)

Затем, чтобы извлечь архив в Linux, я делаю

unix>tar -xvf mytarball.tar.gz  

После распаковки архива я теряю все права доступа «x» к своим файлам.

Любые подсказки, как решить эту проблему?

С Уважением


person user3352256    schedule 30.04.2014    source источник
comment
Я сделал небольшой тест, используя ваш код, и он сохранил разрешения «x». Происходит ли что-то более сложное? Вы уверены, что разрешения правильные, прежде чем они будут добавлены в tarball?   -  person Dan Getz    schedule 30.04.2014
comment
Я копирую архив из Windows в Unix поверх Samba. Я использую Shutil : Shutil.copy(mytarball.tar.gz,unix_dir) Возможно, там что-то происходит. Я должен перепроверить. Но копирование отдельных файлов, кажется, работает. Разрешения сохраняются.   -  person user3352256    schedule 30.04.2014
comment
Ах, хорошо, мой тест был только в Linux, где я знаю, как работают разрешения на выполнение файлов. Не уверен, как Python обрабатывает права на выполнение файлов в Windows.   -  person Dan Getz    schedule 30.04.2014
comment
Поскольку исполняемый файл может иметь разные значения в Linux и Windows, как, по вашему мнению, следует определять, какие файлы имеют права на выполнение?   -  person Dan Getz    schedule 01.05.2014
comment
Шутил делает свое дело. Другими словами, копирование файлов из Windows в Unix через Samba не меняет разрешения. Проблема, по-видимому, заключается в модуле tarfile, который игнорирует разрешения при запуске под окнами. Я распаковал архив в Windows и заметил, что разрешения исчезли.   -  person user3352256    schedule 01.05.2014
comment
Я думал, что при извлечении tar-файла, независимо от того, сохранены ли в нем исходные разрешения, вы должны использовать флаг p, если хотите, чтобы извлеченные файлы имели сохраненные разрешения. Например. tar -xvpf mytarball.tar.gz   -  person Brōtsyorfuzthrāx    schedule 25.03.2016


Ответы (2)


Если вы знаете, какие из ваших файлов должны иметь разрешения на выполнение или нет, вы можете установить разрешения вручную с помощью функции фильтра:

def set_permissions(tarinfo):
    tarinfo.mode = 0777 # for example
    return tarinfo

tar.add('my_folder', filter=set_permissions)
person Dan Getz    schedule 30.04.2014
comment
не смог найти правильный фильтр для моих файлов Windows. Архив всегда пуст. :( - person user3352256; 01.05.2014
comment
Моя вина, я думаю! Забыл вернуть объект tarinfo из моего примера фильтра. Возврат None отфильтрует его из полученного архива, да. - person Dan Getz; 01.05.2014

Основываясь на решении @DanGetz, я сделал это для python3.8:

Я использую потоковый ответ для создания моего tar-файла, но здесь вы видите полный код.

tar_stream = io.BytesIO()
tar = tarfile.TarFile(fileobj=tar_stream, mode='w')
file_data = content.encode('utf8')
tarinfo = tarfile.TarInfo(name=file_name)
tarinfo.size = len(file_data)
tarinfo.mtime = time.time()
tarinfo.mode = 0o740 # <--------
tar.addfile(tarinfo, io.BytesIO(file_data))
tar.close()

В python 2.6 и 3+ вы должны использовать этот формат для разрешений: 0o777 вместо 0777.

из: https://stackoverflow.com/a/1627222/6809926

person Zenocode    schedule 04.05.2021