Python 3.x 如何创建UID/GID为root的tarball?
我试图修改这段代码,以便插入tarball的文件的UID和GID属于rootPython 3.x 如何创建UID/GID为root的tarball?,python-3.x,Python 3.x,我试图修改这段代码,以便插入tarball的文件的UID和GID属于root import tarball sources = [ 'test-directory', 'another-directory/file1' ] with tarfile.open("/tmp/test.tar","w") as tarball: for source in sources: tarball.add(source) sources是目录名和文件名的混合列表。在上面的代码中,
import tarball
sources = [ 'test-directory', 'another-directory/file1' ]
with tarfile.open("/tmp/test.tar","w") as tarball:
for source in sources:
tarball.add(source)
sources
是目录名和文件名的混合列表。在上面的代码中,所有文件都在那里,但都是我的用户UID和GID。如果我在命令行上执行此操作,我会使用fakeroot
作为调用tar
的前缀
在Python(3)中,如果我尝试只查看一个目录:
import tarfile
import glob
with tarfile.open("/tmp/test.tar","w") as tarball:
for filename in glob.iglob('test-directory/**', recursive=True):
info = tarball.gettarinfo(filename)
info.uid = 0
info.gid = 0
info.uname = 'root'
info.gname = 'root'
tarball.addfile(info)
这使我获得了适当的所有权,但它在测试目录树中缺少文件,因为我无法使glob正常工作
我如何才能做到这一点?读取源代码(tarfile.py
)
我在检查上面的add()
方法的基础上添加了这个函数
def add_tarinfo(tarball, tarinfo, name, arcname, fakeroot):
if fakeroot:
tarinfo.uid = 0
tarinfo.gid = 0
tarinfo.uname = 'root'
tarinfo.gname = 'root'
if tarinfo.isreg():
with open(name, "rb") as f:
tarball.addfile(tarinfo, f)
elif tarinfo.isdir():
tarball.addfile(tarinfo)
for f in os.listdir(name):
nname = os.path.join(name, f)
narcname = os.path.join(arcname, f)
ntarinfo = tarball.gettarinfo(nname, narcname)
add_tarinfo(tarfile, ntarinfo, nname, narcname, fakeroot)
else:
tarball.addfile(tarinfo)
因此,原始代码变成:
with tarfile.open("/tmp/test.tar","w") as tarball:
for arcname in self.sources:
name = os.path.join(self.source_path, arcname)
tarinfo = tarball.gettarinfo(name=name, arcname=arcname)
add_tarinfo(tarball, tarinfo, name, arcname, True)