[每周一更]-(第63期):Linux-nsenter命令使用说明

2023-09-18 09:43:43

在这里插入图片描述

nsenter命令是一个可以在指定进程的命令空间下运行指定程序的命令。它位于util-linux包中。

1、用途

一个最典型的用途就是进入容器的网络命令空间。相当多的容器为了轻量级,是不包含较为基础的命令的,
比如说ip address,ping,telnet,ss,tcpdump等等命令,这就给调试容器网络带来相当大的困扰:
只能通过docker inspect ContainerID命令获取到容器IP,以及无法测试和其他网络的连通性。
这时就可以使用nsenter命令仅进入该容器的网络命名空间,使用宿主机的命令调试容器网络。
此外,nsenter也可以进入mnt,uts,ipc,pid,user命令空间,以及指定根目录和工作目录。

2、用法

nsenter [options] [program [arguments]]

options:

  • -t, --target pid:指定被进入命名空间的目标进程的pid
  • -m, --mount[=file]:进入mount命令空间。如果指定了file,则进入file的命令空间
  • -u, --uts[=file]:进入uts命令空间。如果指定了file,则进入file的命令空间
  • -i, --ipc[=file]:进入ipc命令空间。如果指定了file,则进入file的命令空间
  • -n, --net[=file]:进入net命令空间。如果指定了file,则进入file的命令空间
  • -p, --pid[=file]:进入pid命令空间。如果指定了file,则进入file的命令空间
  • -U, --user[=file]:进入user命令空间。如果指定了file,则进入file的命令空间
  • -G, --setgid gid:设置运行程序的gid
  • -S, --setuid uid:设置运行程序的uid
  • -r, --root[=directory]:设置根目录
  • -w, --wd[=directory]:设置工作目录

如果没有给出program,则默认执行$SHELL。

3、示例

在 Linux 系统里,nsenter 是一个命令行工具,用于进入到另一个 namespace。

譬如,nsenter -n -t 1 bash 就是进入到 pid 为 1 的进程所在的网络 namespace 里。

如果不断的执行 nsenter 命令,就形成了一个 nsenter 套娃。

通过nsenter获取容器ip,可进行docker网络连通性测试

# 查看pid
docker inspect 354 -f '{{.State.Pid}}'
30354

# 执行nsenter命令
nsenter -n -t 30354

# 查看容器IP配置 ifconfig
eth0: flags=4163
<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
inet 172.17.0.3  netmask 255.255.0.0  broadcast 0.0.0.0
inet6 fe80::42:acff:fe11:3  prefixlen 64  scopeid 0x20
<link>
ether 02:42:ac:11:00:03  txqueuelen 0  (Ethernet)
RX packets 0  bytes 0 (0.0 B)
RX errors 0  dropped 0  overruns 0  frame 0
TX packets 8  bytes 656 (656.0 B)
TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73
<UP,LOOPBACK,RUNNING>  mtu 65536
inet 127.0.0.1  netmask 255.0.0.0
inet6 ::1  prefixlen 128  scopeid 0x10
<host>
    loop txqueuelen 1000 (Local Loopback)
    RX packets 0 bytes 0 (0.0 B)
    RX errors 0 dropped 0 overruns 0 frame 0
    TX packets 0 bytes 0 (0.0 B)
    TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
    # 退出
    exit

    # 物理机ip配置
    docker0: flags=4163
    <UP ,BROADCAST,RUNNING,MULTICAST> mtu 1500
    inet 172.17.0.1 netmask 255.255.0.0 broadcast 0.0.0.0
    ether 02:42:de:5d:bb:55 txqueuelen 0 (Ethernet)
    RX packets 2388 bytes 231674 (226.2 KiB)
    RX errors 0 dropped 0 overruns 0 frame 0
    TX packets 2517 bytes 1687771 (1.6 MiB)
    TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

    eth0: flags=4163
    <UP ,BROADCAST,RUNNING,MULTICAST> mtu 1500
    inet 172.27.0.9 netmask 255.255.240.0 broadcast 172.27.15.255
    ether 52:54:00:ee:87:05 txqueuelen 1000 (Ethernet)
    RX packets 11373521 bytes 1780959272 (1.6 GiB)
    RX errors 0 dropped 0 overruns 0 frame 0
    TX packets 11638601 bytes 3904021709 (3.6 GiB)
    TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

    lo: flags=73
    <UP ,LOOPBACK,RUNNING> mtu 65536
    inet 127.0.0.1 netmask 255.0.0.0
    loop txqueuelen 1000 (Local Loopback)
    RX packets 785897 bytes 389858802 (371.7 MiB)
    RX errors 0 dropped 0 overruns 0 frame 0
    TX packets 785897 bytes 389858802 (371.7 MiB)
    TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

    veth5a433e9: flags=4163
    <UP ,BROADCAST,RUNNING,MULTICAST> mtu 1500
    ether 02:bd:5e:79:55:c6 txqueuelen 0 (Ethernet)
    RX packets 1056 bytes 136666 (133.4 KiB)
    RX errors 0 dropped 0 overruns 0 frame 0
    TX packets 1447 bytes 116315 (113.5 KiB)
    TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

    vethf366923: flags=4163
    <UP ,BROADCAST,RUNNING,MULTICAST> mtu 1500
    ether 5a:fc:ae:17:dc:a5 txqueuelen 0 (Ethernet)
    RX packets 8 bytes 656 (656.0 B)
    RX errors 0 dropped 0 overruns 0 frame 0
    TX packets 0 bytes 0 (0.0 B)
    TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

4、关于 namespace

namespace是Linux中一些进程的属性的作用域,使用命名空间,可以隔离不同的进程。

Linux在不断的添加命名空间,目前有:

  • mount:挂载命名空间,使进程有一个独立的挂载文件系统,始于Linux 2.4.19
  • ipc:ipc命名空间,使进程有一个独立的ipc,包括消息队列,共享内存和信号量,始于Linux 2.6.19
  • uts:uts命名空间,使进程有一个独立的hostname和domainname,始于Linux 2.6.19
  • net:network命令空间,使进程有一个独立的网络栈,始于Linux 2.6.24
  • pid:pid命名空间,使进程有一个独立的pid空间,始于Linux 2.6.24
  • user:user命名空间,是进程有一个独立的user空间,始于Linux 2.6.23,结束于Linux 3.8
  • cgroup:cgroup命名空间,使进程有一个独立的cgroup控制组,始于Linux 4.6

参考:https://staight.github.io/2019/09/23/nsenter%E5%91%BD%E4%BB%A4%E7%AE%80%E4%BB%8B/

更多推荐

多目标优化算法:基于非支配排序的小龙虾优化算法(NSCOA)MATLAB

一、小龙虾优化算法COA小龙虾优化算法(Crayfshoptimizationalgorithm,COA)由JiaHeming等人于2023年提出,该算法模拟小龙虾的避暑、竞争和觅食行为,具有搜索速度快,搜索能力强,能够有效平衡全局搜索和局部搜索的能力。小龙虾是一种形状类似于虾的甲壳类动物,其甲壳坚硬且颜色丰富。成体的

深度解析NLP文本摘要技术:定义、应用与PyTorch实战

目录1.概述1.1什么是文本摘要?1.2为什么需要文本摘要?2.发展历程2.1早期技术2.2统计方法的崛起2.3深度学习的应用2.4文本摘要的演变趋势3.主要任务3.1单文档摘要3.2多文档摘要3.3信息性摘要vs.背景摘要3.4实时摘要4.主要类型4.1抽取式摘要4.2生成式摘要4.3指示性摘要4.4信息性摘要5.抽

Shell脚本中文英文多语言国际化和命令行批处理(bash sh cmd bat)中定义函数的简单写法

文章目录命令行脚本参考-bat命令行脚本参考-bash值得学习的知识点1.识别终端使用的语言2.函数的编写3.获取用户的输入4.bat文件老是乱码怎么办有时候为了方便别人使用,我们会选择去编写各种各样的命令行脚本:给Windows用户编写.batcmd批处理脚本,给macOS、Linux用户编写.shbashshell

鼠标、键盘、窗口监听事件

一、画笔paint//画笔publicclassTestPaint{publicstaticvoidmain(String[]args){newMyPaint().loadFrame();​}}​classMyPaintextendsFrame{​publicvoidloadFrame(){setBounds(200,

flex:1详解,以及flex:1和flex:auto的区别

什么是flex:1?在css中,我们经常可以看到这样的写法:.box{display:flex;}.item{flex:1;}这里的flex:1相当于flex:110%,它是一个简写属性,表示项目(flexitem)在弹性容器(flexcontainer)中如何伸缩。它相当于flex:110%,包含了三个子属性:fle

JDK动态代理

Java中的两种常用动态代理方式JDK动态代理和Cglib动态代理是Java中常用的实现动态代理的方式。它们都可以在运行时生成代理类,实现对目标对象的代理操作。JDK动态代理适用于接口代理,Cglib动态代理适用于类代理。Cglib动态代理Cglib动态代理是基于继承的动态代理方式。它通过生成目标类的子类来实现代理,子

3.SpringEL方法调用实例

SpringEL方法调用实例文章目录SpringEL方法调用实例介绍SpringEL在注解的形式SpringEL调用List,Map中的方法**从List中过滤元素****从Map中获取值**SpringEL在XML的形式介绍Spring表达式语言(使用SpEL)允许开发人员使用表达式来执行方法和将返回值以注入的方式到

线路板的性能和技术要求有哪些

PCB加工厂家电路板的性能和技术要求与线路板的结构类型、选用的基材有关。不同类型(刚性和挠性)、不同结构(单面、双面、多层、有或无盲孔、埋孔等)、不同基材的PCB板,性能指标是不同的。它的性能等级,与产品设计一样按使用范围通常分为三个等级,PCB厂家描述产品在复杂性、功能性要求的程度和试验、检验的频度的不同。不同性能等

java 单元测试Junit

所谓单元测试,就是针对最小的功能单元,编写测试代码对其进行正确性测试。为了测试更加方便,有一些第三方的公司或者组织提供了很好用的测试框架,给开发者使用。这里介绍一种Junit测试框架。Junit是第三方公司开源出来的,用于对代码进行单元测试的工具(IDEA已经集成了junit框架)。相比于在main方法中测试有如下几个

[设计模式] 浅谈SOLID设计原则

目录单一职责原则开闭原则里氏替换原则接口隔离原则依赖倒转原则SOLID是一个缩写词,代表以下五种设计原则单一职责原则SingleResponsibilityPrinciple,SRP开闭原则Open-ClosedPrinciple,OCP里氏替换原则LiskovSubstitutionPrinciple,LSP接口隔离

华为OD机试真题 Java 实现【路灯照明问题】【2022Q4 100分】,感谢fly晨发现这个问题,并提供更优质的算法

目录专栏导读一、题目描述二、输入描述三、输出描述四、解题思路特别鸣谢:感谢fly晨发现这个问题,并提供更优质的算法。解题思路如下:五、Java算法源码六、效果展示1、输入2、输出3、思路专栏导读本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释

热文推荐