subprocess.check_output игнорирует euid

У меня есть следующий bash-скрипт:

echo "$(id -u)"
mkdir test

Мой собственный идентификатор пользователя — 1000. Теперь, когда я запускаю python3.5 без прав root и запускаю скрипт через subprocess.check_output, скрипт работает, как и ожидалось, и создает папку, которая принадлежит мне. Однако, когда я запускаю python с помощью sudo, а затем использую os.setegid(1000); os.setuid(1000), скрипт выводит 0, а папка «test» принадлежит пользователю root. Хотя я понимаю, что echo "$(id -u)" может быть желательным поведением, я не понимаю, почему эта папка принадлежит пользователю root. Разве функция os.seteuid() не должна этому препятствовать?

Мой точный вызов:

>>> os.setegid(1000)
>>> os.seteuid(1000)
>>> subprocess.check_output(["/.script.sh"])

В результате папка «test» принадлежит пользователю root. Является ли это желаемым поведением, и если да, то есть ли способ запустить скрипт как обычный пользователь, сохраняя при этом возможность вернуться к root-правам в скрипте python (т.е. не устанавливая «настоящий» uid?)


person Sleik    schedule 02.11.2017    source источник


Ответы (1)


setegid задает только эффективный идентификатор группы текущего процесса. То же самое с seteuid.

check_output порождает новый процесс, который, по-видимому, по-прежнему запускается от имени пользователя root. Возможно, вам повезет больше, если вы попытаетесь создать свою папку с помощью python вместо того, чтобы тратиться на это, но я думаю, что это упрощенный пример, поэтому он может быть неуместным. Можно ли запустить скрипт python от имени ожидаемого пользователя? Если нет, вам может понадобиться сделать что-то подобное;

subprocess.check_output(["sudo", "-uexpected_user", "./script.sh"])
person Shadow    schedule 02.11.2017