Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何创建UID/GID为root的tarball?_Python 3.x - Fatal编程技术网

Python 3.x 如何创建UID/GID为root的tarball?

Python 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是目录名和文件名的混合列表。在上面的代码中,

我试图修改这段代码,以便插入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
是目录名和文件名的混合列表。在上面的代码中,所有文件都在那里,但都是我的用户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)