Chown Операция запрещена:

Основная проблема заключалась в том, что я еще не перезагрузил компьютер, после перезагрузки os.chown, shutil.chown и другие команды работали нормально, пока я передал разрешения группе, членом которой я также являюсь

Я загрузил zip-файл из API и сохранил его, используя:

with urllib.request.urlopen(req) as response, \
        open(out_folder, 'wb') as out_file:
    shutil.copyfileobj(response, out_file)

Я хотел бы разрешить другому пользователю доступ к этому файлу. Однако я не смог этого сделать. Я пытался:

process = subprocess.Popen(['chown', '-R', f"{user}:{user}", out_folder],
                           stdout=subprocess.PIPE)
process.communicate()

Что терпит неудачу для каждого утверждения, говорящего мне, что операция не разрешена.

Затем я попытался добавить sudo в список команд, но это привело только к тому, что строка process.communicate() зависла навсегда.

Далее я попробовал:

shutil.chown(out_folder, user=user)

Что тоже не сработало. Я подумал, что, возможно, это сработает, если я напишу это в общую группу, частью которой являемся я и другой пользователь:

shutil.chown(out_folder, group=shared_group)

Это также не удалось, опять же с ошибкой разрешения.

У меня закончились идеи, и я не знаю, что делать. Возможно ли сразу записывать файлы правильному пользователю?


person Nathan    schedule 12.06.2019    source источник


Ответы (2)


Я нашел рабочее решение:

import pwd
import grp
import os


uid = pwd.getpwnam(usernmae).pw_uid    
gid = grp.getgrnam(groupname).gr_gid
os.chown(out_folder, uid, gid)

Как ни странно, это не работает для всех групп, в которых я состою (проблема решилась перезагрузкой моего компьютера)

person Nathan    schedule 12.06.2019

Единственным пользователем, который может выполнить chown в любой момент, является root. Я бы посоветовал вам запускать вашу программу/скрипт как пользователь root (или используя sudo).

chown также можно использовать, когда файл, права которого вы хотите изменить, находится в той же группе, что и вы, или, если обе группы связаны (см. /etc/groups, извините, я не знаю синтаксис наизусть).

person Dominique    schedule 12.06.2019
comment
Это работает, но, в конце концов, я хочу превратить это в образ докера, чтобы запускать его автоматически. Я не могу выполнить файл как sudo. - person Nathan; 12.06.2019
comment
Неужели невозможно передать файл группе, в которой я состою, не прибегая к sudo? - person Nathan; 12.06.2019
comment
@Nathan: я отредактировал свой ответ в соответствии с вашим комментарием. - person Dominique; 12.06.2019
comment
спасибо за Ваш ответ. Это оказалось полезным, поэтому я проголосовал за него, но он не ответил на вопрос, поэтому я не приму его, чтобы не смущать будущих читателей. - person Nathan; 12.06.2019