Python tarfile和用户、组信息问题

Python tarfile和用户、组信息问题,python,tarfile,Python,Tarfile,我正在使用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 但在提取后,我丢失了所有的用户、组、日期。。。信息。它们现在属

我正在使用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
有没有办法保存文件所有者、文件日期信息

发件人:

-
处理目录、常规文件、硬链接、符号链接、FIFO、字符设备和块设备,并能够获取和恢复时间戳、访问权限和所有者等文件信息。

从这句话中,我了解到通过“tarfile”模块很有可能做到这一点,还是我理解错了

Python版本是2.6.1

编辑:我以root用户身份运行此脚本


首先,您的脚本需要以root用户身份运行(在类unix系统上)。否则,您不能使用chown

您需要获取文件的TarInfo对象:

在这里您可以得到uid(用户id)、gid(组id)和(或用户名)


然后您需要使用chown。

正如guettli所说,您必须是root用户才能将文件的所有权更改为其他人。否则,就会打开一个巨大的安全漏洞。当使用tar(1)程序或试图使用python的tarfile包时,这是正确的


但是请注意,一些早期版本的Python有一个bug(请参阅下面评论中的问题),这意味着由root提取的文件归root所有,而不是真正的所有者(用户和组)。

如果您以root身份运行此程序,tarfile包将为您完成任务。事实上,如果您从命令行运行tar,它将同时运行。我知道这一点,但我认为这一定是一种默认行为。如果不是,那么我可以用subprocess调用“tar”,这将减少我的案例@leeman的时间实际上,对我来说,它与命令行上的“tar”不一样。在以root身份运行之后,它们都变成root:rootI抱歉,但不是。如果我以root身份调用子进程的“tar”,那么所有权限都会得到很好的应用。但如果我以root用户身份运行上面的脚本,那么它们都会变成root用户:root问题是:--请注意,当我在运行2.6.1的OS X box上以root用户身份运行您的脚本时,它工作正常,所以看起来Apple在我的版本中解决了这个问题。感谢您的bug页面。如果你编辑你的答案,我可以接受你的编辑说你正在“以root身份运行这个脚本”,但我认为这是不对的。您必须以“usr3:grp3”的身份运行它,这取决于您看到的提取文件的所有权。如果您以root用户身份运行它,您应该会看到正确拥有的文件,或者由root用户拥有的文件,这取决于您使用的Python版本。您可以假定它是root:root,而不是usr3:grp3