$ id
uid=1000(user) gid=1000(user) groups=1000(user),44(video)
$ ip -br a
lo UNKNOWN 127.0.0.1/8 ::1/128
eth0@if11 UP 10.0.3.66/24 fe80::216:3eff:fe6a:c1e9/64
$ ./removenet bash
$ id
uid=1000(user) gid=1000(user) groups=1000(user),65534(nogroup)
$ ip -br a
lo DOWN
我很惊讶你仍然可以
su user
,在 Linux 内核 3.19 之后,su
命令可能会变得混乱。unshare 命令不够灵活:它只允许映射到 root。
unshare
您必须在任何 fork/exec 之后但在任何 fork/exec 之前通过写入"<user> <user> 1"
(/proc/self/uid_map
对于 也是如此)映射到自己/proc/self/gid_map
。所有最近的内核还需要先写入deny
:/proc/$$/setgroups
所有补充组(例如:视频)都必须丢失,这是不可避免的,就像unshare -U/-r
.这是一个非常简单的C 程序,仅作为概念证明,它不会做任何检查来执行您要求的操作,但前提是由具有 uid/gid 1000/1000 的用户运行:丢失网络。随意改进它。
如果文件被调用
removenet.c
,用gcc -o removenet removenet.c
.另请注意,新的网络命名空间的
lo
接口已启动,并且由于您不是 root,因此您甚至无法设置它。您可以运行此程序的变体以在成为 root后恢复为以前的用户,例如,通过再次
unshare -r -n -m
更改为新的用户命名空间。这允许首先设置一些环境,比如安装看不到以前的接口,启动接口等。请参阅我对类似问题的回答(使用相同的代码,您只需再次添加):/sys
lo
|CLONE_NEWNET
unshare --map-root-user 设置后切换到原始 uid/用户名
需要明确的是:我不知道有任何标准实用程序能够使用简单的 shell 命令完成您所要求的工作。因此,您必须求助于使用 shell 之外的其他语言:C、python、... 甚至还有ctypes.sh 用于 bash 的外部函数接口。
我的另一个答案还提供了一些附加信息和另一种“语言”,即 gdb 调试器:
如何取消当前进程的网络共享