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

非共享用户命名空间中os.setuid报错[Errno 22] Invalid argument求助

解决非共享用户命名空间中os.setuid(0)报Invalid Argument的问题

问题原因

调用os.unshare(os.CLONE_NEWUSER)创建新用户命名空间后,内核默认不会自动将外部的UID/GID映射到命名空间内部的UID/GID(比如root的0)。此时直接调用os.setuid(0),内核找不到对应的映射关系,就会抛出[Errno 22] Invalid argument错误。

修复方案

需要手动配置UID/GID映射,步骤如下:

  1. 普通用户运行时必须先禁用setgroups,避免写入gid_map时失败;
  2. 将外部当前UID映射到内部的0;
  3. 将外部当前GID映射到内部的0;
  4. 再调用setuid/setgid。

修改后的代码:

import os

# 创建新用户命名空间
os.unshare(os.CLONE_NEWUSER)

# 普通用户运行时需先禁用setgroups,否则写入gid_map会失败
with open('/proc/self/setgroups', 'w') as f:
    f.write('deny')

# 获取当前外部的UID和GID
external_uid = os.getuid()
external_gid = os.getgid()

# 配置UID映射:将外部UID映射到内部0
with open('/proc/self/uid_map', 'w') as f:
    f.write(f'0 {external_uid} 1')

# 配置GID映射:将外部GID映射到内部0
with open('/proc/self/gid_map', 'w') as f:
    f.write(f'0 {external_gid} 1')

# 现在可成功切换到命名空间内的root
os.setuid(0)
os.setgid(0)

# 启动bash验证权限
os.system('/bin/bash')

额外说明

  • 若以root用户运行,/proc/self/setgroups的步骤可省略,保留也不影响;
  • uid_map和gid_map的格式为内部UID 外部UID 范围,这里1表示仅映射单个UID/GID;
  • 配置映射后,你在新命名空间内拥有root权限,但这是命名空间内的伪权限,不会影响主机系统的实际权限。

内容的提问来源于stack exchange,提问作者Xandaaah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 23:14:52