我需要以“ nobody”用户身份在主流程中运行一个子流程,如下所示:
def set_id() -> None:
logging.warning(f"sub !sub! process user id is {os.getuid(), os.getgid(), os.getgroups()}!!!!!!!!!!!!")
# out: root:sub !sub! process user id is (0, 0, [])!!!!!!!!!!!!
# os.setgid(65534) # work fine
os.setuid(65534) # can't work
pro = await asyncio.subprocess.create_subprocess_exec(
# *tmp_cmd,
"ls",
stdout=asyncio.subprocess.PIPE,
stdin=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.PIPE,
cwd=self._cwd,
preexec_fn=set_id,
start_new_session=True,
close_fds=True,
)
当我打电话给os.setuid(65534)
时,引发错误 PermissionError: [Errno 13] Permission denied
。但是os.setgid(65534)
工作正常。这就是为什么?我怎样才能解决这个问题?提前致谢。
[os.setuid()
方法通常仅对超级用户(root
或具有类似权限的其他用户)可用,因为只有超级用户才能更改用户ID。