如果sshd
在适当的物理设备的(非 init)命名空间中运行:
ip netns exec physical sshd
是否可以让连接到该接口的客户端获得具有不同默认命名空间(在我的例子中为 init 命名空间)的 shell?
事实上,客户端命令就像运行一样ip netns exec physical <cmd>
- 这当然是有道理的,但在这种情况下不是我想要的。
答案1
啊,我找到了一个解决方案:netns
将其已知的命名空间存储在/var/run/netns/
;这些只不过man namespaces
是/proc/<PID>/ns/
.
因此,我们可以在那里添加 init 命名空间,即使它通常不存在:
ln -s /proc/1/ns/net /var/run/netns/init
然后,我们可以强制客户端在连接时在该命名空间中打开 shell,并可以选择sshd
:
-o ForceCommand='sudo ip netns exec init sudo /bin/bash --login'
因此,守护进程仍然在指定的非 init 命名空间中运行,但客户端连接并立即进入 init (PID 1) 网络命名空间。
注意:我们还可以保留连接用户而不是跳转到 root(!),并用于getent passwd
检索他们常用的登录 shell:
# instead of sudo /bin/bash
# *important*: we give ForceCommand='' in *single* quotes
# so `whomai` et al. are not evaluated until the ForceCommand is invoked.
sudo --user="$(whoami)" "$(getent passwd "$(whoami)" | cut -d: -f7)"
ssh user@host cmd
并通过从$SSH_ORIGINAL_COMMAND
命令的前面拉出它来保留客户端 ( ) 提供的任何命令。