13836

69 分钟

#Bash 的 nsenter 命令

nsenter [OPTION]... [CMD [ARG]...]

功能

进入指定的命名空间然后运行命令。

类型

可执行文件(/usr/bin/nsenter),属于 util-linux

参数

  • OPTION 选项:
    • -a, --all - 根据默认的命名空间路径 /proc/${PID}/ns/* 进入目标进程的所有命名空间;与 t 选项一同使用
    • -t, --target PID - 通过 PID 指定目标进程;进入目标进程的命名空间
    • -m, --mount[=file] - 进入 file 指定的 mount namespace;如果没有 file,则进入目标进程的 mount namespace
    • -u, --uts[=file] - 进入 file 指定的 UTS namespace;如果没有 file,则进入目标进程的 UTS namespace
    • -i, --ipc[=file] - 进入 file 指定的 IPC namespace;如果没有 file,则进入目标进程的 IPC namespace
    • -n, --net[=file] - 进入 file 指定的 network namespace;如果没有 file,则进入目标进程的 network namespace
    • -p, --pid[=file] - 进入 file 指定的 PID namespace;如果没有 file,则进入目标进程的 PID namespace
    • -U, --user[=file] - 进入 file 指定的 user namespace;如果没有 file,则进入目标进程的 user namespace
    • -C, --cgroup[=file] - 进入 file 指定的 cgroup namespace;如果没有 file,则进入目标进程的 cgroup namespace
    • -T, --time[=file] - 进入 file 指定的 time namespace;如果没有 file,则进入目标进程的 time namespace
    • -G, --setgid gid - 设置组 ID 并删除补充组 ID;默认为 0
    • -S, --setuid uid - 设置用户 ID;默认为 0
    • --preserve-credentials - 不修改用户 ID 和 组 ID
    • -r, --root[=directory] - 设置根目录
    • -w, --wd[=directory] - 设置工作目录;在进入命名空间之前打开
    • -W, --wdns[=directory] - 设置工作目录;在 chroot 指定打开
    • -e, --env - 将目标进程的环境变量传递给新创建的进程
    • -F, --no-fork - 不要在 exec 之前调用 fork 函数
    • -Z, --follow-context - 将目标进程的安全上下文传递给新创建的进程
    • -h, --help - 显示帮助
    • -V, --version - 显示版本
  • CMD - 要执行的命令;默认执行 ${SHELL}
  • ARG - 命令的参数列表

#Linux 的命名空间

命名空间中文说明
mount namespace挂载或卸载文件系统不会影响系统的其他部分,除非该文件系统被显式标记为共享(使用 mount --make-shared;共享标志可在 /proc/self/mountinfo 中查看)。更多细节参见 mount_namespaces(7) 以及 clone(2) 中关于 CLONE_NEWNS 标志的说明。
UTS namespace设置主机名(hostname)或域名(domainname)不会影响系统的其他部分。更多细节参见 uts_namespaces(7)
IPC namespace进程将拥有独立的 IPC 命名空间,包括 POSIX 消息队列,以及 System V 消息队列、信号量集合和共享内存段。更多细节参见 ipc_namespaces(7)
network namespace进程将拥有独立的 IPv4 和 IPv6 协议栈、IP 路由表、防火墙规则、/proc/net/sys/class/net 目录树、套接字等资源。更多细节参见 network_namespaces(7)
PID namespace子进程将拥有一套与 nsenter 进程分离的 PID 到进程映射关系。如果更改 PID 命名空间,nsenter 默认会执行 fork,以便新程序及其子进程共享同一个 PID 命名空间并彼此可见。如果使用 --no-fork,则新程序将在不进行 fork 的情况下通过 exec 启动。更多细节参见 pid_namespaces(7)
user namespace进程将拥有独立的一组 UID、GID 以及能力(capabilities)。更多细节参见 user_namespaces(7)
cgroup namespace进程将看到虚拟化后的 /proc/self/cgroup 视图,新创建的 cgroup 挂载点将以该命名空间的 cgroup 根目录为起点。更多细节参见 cgroup_namespaces(7)
time namespace进程可以拥有独立的 CLOCK_MONOTONIC 和/或 CLOCK_BOOTTIME 视图,这些时间偏移可通过 /proc/self/timens_offsets 进行修改。更多细节参见 time_namespaces(7)

#示例

$ nsenter -t 12345 -a ls    # 进入进程 12345 的所有命名空间,执行 ls
$ nsenter -t 12345 -a       # 进入进程 12345 的所有命名空间,执行 /bin/bash

#相关命令

命令说明
unshare创建新的命名空间执行命令

#推荐阅读

#手册

更新: 2026/3/2

作者: PlanC

创建: 2026/3/2