![有没有办法通过 ssh 连接将经过身份验证的 ssh 用户代理到已经运行的 docker 容器中?](https://linux22.com/image/1596183/%E6%9C%89%E6%B2%A1%E6%9C%89%E5%8A%9E%E6%B3%95%E9%80%9A%E8%BF%87%20ssh%20%E8%BF%9E%E6%8E%A5%E5%B0%86%E7%BB%8F%E8%BF%87%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81%E7%9A%84%20ssh%20%E7%94%A8%E6%88%B7%E4%BB%A3%E7%90%86%E5%88%B0%E5%B7%B2%E7%BB%8F%E8%BF%90%E8%A1%8C%E7%9A%84%20docker%20%E5%AE%B9%E5%99%A8%E4%B8%AD%EF%BC%9F.png)
我有一个 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