Ответ 1
Возможно, вы могли бы использовать os.stat
, чтобы получить guid
и uid
как в этот ответ, а затем reset uid
и guid
после использования os.chown
.
В документах из "Ворот" сказано:
Даже функции копирования файлов более высокого уровня (shutil.copy(), shutil.copy2()) не могут скопировать все метаданные файлов. На платформах POSIX это означает, что владелец файла и группа потеряны, а также ACL
Как сохранить владельца файла и группу, если мне нужно скопировать файл в python?
Процесс выполняется на Linux как root.
Обновление: мы не используем ACL. Нам нужно только сохранить материал, который сохраняется с помощью таких инструментов, как tar и rsync.
Возможно, вы могли бы использовать os.stat
, чтобы получить guid
и uid
как в этот ответ, а затем reset uid
и guid
после использования os.chown
.
Вы можете использовать модуль subprocess
:
from subprocess import Popen
p = Popen(['cp','-p','--preserve',src,dest])
p.wait()
Я сделал это следующим образом:
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])
Я предлагаю вам использовать модули ОС и подпроцессов. Это будет работать только в 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)
См. Сохраняя файловое хранилище и разрешения после копирования файла в C, как это делает cp
, а затем просто повторите его логику. Python имеет все системные вызовы, упомянутые в модуле os
.