有沒有辦法在 ssh 連線時將經過驗證的 ssh 使用者代理到已經執行的 docker 容器中?

有沒有辦法在 ssh 連線時將經過驗證的 ssh 使用者代理到已經執行的 docker 容器中?

我有一個 Dockerized Jupyter Notebook,始終在 Linux 主機上運行(我可以訪問 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)"

目前,我需要先 ssh 進入主機,然後執行類似docker exec -it <container-name> bash在 Docker 容器中啟動 bash shell 之類的操作。

我想知道是否有一種方法可以將初始 ssh 命令代理到容器中,與 ProxyCommand 間接連接到第二個主機的方式大致相同。

答案1

我找到了一個似乎適合我的需求的解決方案。

將其添加到 ~/.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

現在在客戶端上設定 ssh 配置,如下所示:

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

我還測試了它與 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

相關內容