tarfile и пользователь, проблема групповой информации - PullRequest
0 голосов
/ 30 августа 2011

Я использую модуль python tarfile для извлечения файлов из файла * .tgz.Вот что я использую:

import tarfile
tar = tarfile.open("some.tar")
tar.extractall(".")
tar.close()

Предположим, что содержимое "some.tar":

-a.txt ===> user:usr1 , group: grp1
-b.txt ===> user:usr2 , group: grp2

Но после извлечения я теряю всю информацию о пользователе, группе, дате ...Теперь они принадлежат тому, кто вызывает скрипт (в моем случае root).Они становятся такими:

-a.txt ===> user:root , group: root
-b.txt ===> user:root , group: root

Есть ли способ сохранить владельца файла, информацию о дате файлов?

Со страницы модуля tarfile :

- handles directories, regular files, hardlinks, symbolic links, fifos, character devices and block devices and is able to acquire and restore file information like timestamp, access permissions and owner.

Из этого утверждения я понимаю, что это вполне возможно сделать с помощью модуля "tarfile", или я правильно понимаю?

Версия Python - 2.6.1

Редактировать: я запускаю этот скрипт от имени root

Спасибо

Ответы [ 2 ]

0 голосов
/ 30 августа 2011

Как говорит Геттли, вы должны быть пользователем root, чтобы иметь возможность сменить владельца файла на кого-то другого. В противном случае вы откроете огромную дыру в безопасности. Это верно при использовании программы tar (1) или при попытке использовать пакет tarfile из python.

Обратите внимание, что в некоторых более ранних версиях Python есть ошибка (см. Проблему в комментариях ниже), которая означает, что файлы, извлеченные пользователем root, принадлежат пользователю root, а не реальному владельцу (пользователю и группе).

0 голосов
/ 30 августа 2011

Во-первых, ваш скрипт должен запускаться с правами суперпользователя (в Unix-подобных системах).В противном случае вы не можете использовать chown.

Вам необходимо получить объект TarInfo для файлов:

http://docs.python.org/library/tarfile.html#tarfile.TarInfo

Там вы получите uid (идентификатор пользователя) иgid (идентификатор группы) и (или имя пользователя).

Тогда вам нужно использовать chown.

...