Existe uma maneira de fazer proxy de um usuário ssh autenticado em um contêiner docker já em execução na conexão ssh?

Existe uma maneira de fazer proxy de um usuário ssh autenticado em um contêiner docker já em execução na conexão ssh?

Eu tenho um Jupyter Notebook Dockerizado sempre rodando em um host Linux (onde tenho acesso ssh).

docker run -d \
    --hostname="$(logname)-sandbox" \
    -e NB_UID="$(id -u $(logname))" \
    -e NB_GID="$(id -g $(logname))" \
    -e GRANT_SUDO=1 \
    -e NB_USER="$(id -un $(logname))" \
    -e NB_GROUP="$(id -gn $(logname))" \
    --user=root \
    --restart=always \
    --name="$(logname)-sandbox" \
    -v "${HOME}":"/home/$(logname)" \
    -p 8010:8888 \
    jupyter/base-notebook:latest \
    start-notebook.sh --notebook-dir="/home/$(logname)"

Atualmente preciso primeiro fazer ssh no host e, em seguida, faço algo como docker exec -it <container-name> bashiniciar um shell bash dentro do contêiner Docker.

Eu queria saber se havia uma maneira de fazer proxy do comando ssh inicial no contêiner, da mesma maneira que o ProxyCommand faz para se conectar indiretamente a um segundo host.

Responder1

Encontrei uma solução que parece estar funcionando para minhas necessidades.

Adicione isto ao topo de ~/.bashrc

# Enter Container if SANDBOX=1, else continue as normal
if [[ "${SANDBOX}" -eq "1" ]]; then
    # Only allocate tty if one is detected, see: https://stackoverflow.com/questions/911168
    if [[ -t 0 ]]; then DOCKER_RUN_OPTIONS+=(-i); fi
    if [[ -t 1 ]]; then DOCKER_RUN_OPTIONS+=(-t); fi
    exec docker exec "${DOCKER_RUN_OPTIONS[@]}" "$(logname)-sandbox" bash "$@"
fi

Agora configure uma configuração ssh no cliente assim:

Host vm1
    User my_user
    HostName my_host
Host vm1-sandbox
    User my_user
    HostName my_host
    RemoteCommand export SANDBOX=1; bash
    RequestTTY force

Também testei se funciona conforme o esperado em combinação com JumpHost:

Host vm2_jump
    User jump_user
    HostName jump_host
Host vm2
    User my_user
    HostName my_host
    ProxyJump vm2_jump
Host vm2-sandbox
    User my_user
    HostName my_host
    ProxyJump vm2_jump
    RemoteCommand export SANDBOX=1; bash
    RequestTTY force

informação relacionada