Копировать файл, сохранять разрешения и владельца

В документах из "Ворот" сказано:

Даже функции копирования файлов более высокого уровня (shutil.copy(), shutil.copy2()) не могут скопировать все метаданные файлов. На платформах POSIX это означает, что владелец файла и группа потеряны, а также ACL

Как сохранить владельца файла и группу, если мне нужно скопировать файл в python?

Процесс выполняется на Linux как root.

Обновление: мы не используем ACL. Нам нужно только сохранить материал, который сохраняется с помощью таких инструментов, как tar и rsync.

Ответ 1

Возможно, вы могли бы использовать os.stat, чтобы получить guid и uid как в этот ответ, а затем reset uid и guid после использования os.chown.

Ответ 2

Вы можете использовать модуль subprocess:

from subprocess import Popen

p = Popen(['cp','-p','--preserve',src,dest])
p.wait()

Ответ 3

Я сделал это следующим образом:

import os
import stat
import shutil

def copyComplete(source, target):
    # copy content, stat-info (mode too), timestamps...
    shutil.copy2(source, target)
    # copy owner and group
    st = os.stat(source)
    os.chown(target, st[stat.ST_UID], st[stat.ST_GID])

Ответ 4

Я предлагаю вам использовать модули ОС и подпроцессов. Это будет работать только в Unix, но оно должно работать хорошо. Используйте команду os.fchown, чтобы изменить права собственности на файл, а subprocess.Popen() - передать ls -l в переменную, чтобы прочитать право собственности. Для одного файла читатель разрешений будет выглядеть следующим образом:

import os
import subprocess

def readfile(filepath):
    process = subprocess.Popen(["ls","-l"],stdout=subprocess.PIPE)
    output = process.communicate()[0]
    output = output.split()
    return (output[0],output[1])  #insert into this tuple the indexing for the words you want from ls -l

и для установщика uid (просто оболочка для функции os):

def setuid(filepath,uid,gid):
    os.chown(filepath,uid,gid)