You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python调用libc.clone创建用户命名空间后,用户ID始终为65534(nobody)的问题求助

使用Python调用libc.clone创建用户命名空间后,用户ID始终为65534(nobody)的问题求助

我正在尝试用Python脚本调用clone系统调用创建一个新的用户命名空间,目标是将新生成的shell的用户ID映射到特定值,就像unshare命令那样。

当我运行unshare --user sh时,可以通过以下命令成功更新UID映射:

echo '0 502 1' > /proc/[PID]/uid_map
echo '0 502 1' > /proc/[PID]/gid_map

之后在新shell里运行id会显示用户是root。

但当我尝试用Python的libc.clone做同样的操作时,即使更新了UID和GID映射,shell仍然显示用户ID为65534(nobody)。我的脚本如下:

import signal
import os
import ctypes
import sys

CLONE_NEWUTS = 0x04000000
CLONE_NEWUSER = 0x10000000

def write_file(path, content):
    try:
        with open(path, "w") as f:
            f.write(content)
    except Exception as e:
        sys.exit(f"[Error] Failed to write mapping {content} to {path}: {e}")

def child_func():
    input("...>")
    os.execlp("bash", "sh")  # Start a new shell

libc = ctypes.CDLL("libc.so.6", use_errno=True)
STACK_SIZE = 1024 * 1024
stack = ctypes.create_string_buffer(STACK_SIZE)

child_stack = ctypes.c_void_p(ctypes.addressof(stack) + STACK_SIZE)
pid = libc.clone(
    ctypes.CFUNCTYPE(ctypes.c_int)(child_func),
    child_stack,
    CLONE_NEWUTS | CLONE_NEWUSER | signal.SIGCHLD,
)

if pid == -1:
    sys.exit("Failed to create new namespace")

print(pid)
write_file(f"/proc/{pid}/setgroups", "deny\n")
write_file(f"/proc/{pid}/uid_map", f"0 502 1\n")
write_file(f"/proc/{pid}/gid_map", f"0 502 1\n")

os.waitpid(pid, 0)

我已经检查过的内容:

  • 脚本是用root权限执行的。
  • UID和GID映射文件是在clone调用之后更新的。

尽管做了这些步骤,命名空间内的用户仍然是nobody。我可能漏掉了什么?欢迎任何建议或见解。

备注:内容来源于stack exchange,提问作者Aoldguy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 08:48:00