如何在新的Linux命名空间中创建进程

问题描述 投票:0回答:1

我正在尝试在新的 Linux 命名空间下使用 Python 创建一个子进程。但检查 subprocess 文档 似乎 Python 实际上并没有一个 API 可以做到这一点。我发现的最接近的是

unshare
模块中的
os
方法(here)。但这似乎需要以下步骤:

  1. 在与当前父进程相同的命名空间中创建子进程
  2. 运行取消共享隔离子进程
  3. 在子进程中运行我们想要的命令

这与首先创建一个独立的流程并不完全相同。 Python 中确实没有简单的 API 可以实现这一点吗?

作为示例,以下是 Go 中的类似代码:

cmd := exec.Command(...)
cmd.SysProcAttr = &syscall.SysProcAttr {
    Cloneflags: syscall.CLONE_NEWUTS
}
cmd.Run()

问题是如何用Python实现同样的效果。

python linux-namespaces
1个回答
1
投票

没有其他好的 Python API 可以做到这一点。

os.unshare()
os.setns()
是目前唯一用于操作命名空间的 API(自 Python 3.12 起)。 功能请求也提到了这一点:

就目前而言,更改到不同的命名空间确实很混乱,必须使用 ctypes,并调用 libc 函数来完成此操作。 我认为实现 setns 和 unshare 函数将使在 Python 中使用命名空间变得更加容易

您当然可以通过

clone
(加载 C 库)手动发出带有
CLONE_NEWxxx
标志的
ctypes
系统调用,但这会非常混乱并且绝对不安全,因为它不会考虑内部解释器之类的事情锁等

© www.soinside.com 2019 - 2024. All rights reserved.