sshd
適切な物理デバイスの(非初期化)名前空間で実行されている場合:
ip netns exec physical sshd
このインターフェイスに接続されているクライアントが異なるデフォルトのネームスペース(私の場合はinitネームスペース)を持つシェルをインポートできますか?
実際、クライアントコマンドは実行と同じです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
その後、クライアントが接続するときにその名前空間でシェルを開くように強制できますsshd
。オプションで、次のようになります。
-o ForceCommand='sudo ip netns exec init sudo /bin/bash --login'
したがって、デーモンは指定された非init名前空間で実行され続けますが、クライアントは接続され、すぐにinit(PID 1)ネットワーク名前空間に入ります。
注:ルート(!)に移動するのではなく、接続ユーザーを維持し、getent passwd
一般的なログインシェルを検索するために使用することもできます。
# 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
そして、クライアント()によって提供されたコマンドをコマンドの前半で取得して保持します。