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
그리고 클라이언트( )가 제공한 명령을 명령 앞부분 에서 가져와 유지합니다.