如何正确配置ssh proxycommand以运行docker exec?

时间:2015-12-24 00:41:19

标签: linux ubuntu ssh proxy docker

我在/etc/hosts中定义了一个名为web1的主机。 有一个名为store的docker容器。

在我的工作站上,我可以进入机器并执行命令以交互方式输入容器

ssh -t -t web1 docker exec -ti store /bin/bash

它正确地将我直接放入容器中,正如我所希望的那样。

但是,我真的想要定义一个名为store的伪主机并使用~/.ssh/config在我的ProxyCommand文件中设置它,这样我就可以使用ssh store

Host store
ProxyCommand ssh -t -t web1 docker exec -ti store /bin/bash

但它失败并出现以下错误:

Bad packet length 218958363.
ssh_dispatch_run_fatal: Connection to UNKNOWN: message authentication code incorrect
Killed by signal 1.

如果我为某些调试添加了-v,那么上面的块之前的最后两行是

debug1: Authenticating to store:22 as 'user1'
debug1: SSH2_MSG_KEXINIT sent
  1. 我认为它正在尝试ssh进入store容器而不是仅执行抛出该错误的命令,这是正确的吗?如果不是什么问题?
  2. 有没有办法使用ProxyCommand执行此操作而不尝试ssh到容器,而只是使用docker exec?
  3. 是否也很容易将ssh设置到容器中?我们目前并不是这样做的。
  4. 除了ssh-store的别名还有其他选项吗?
  5. 最终目标是定义一个虚拟主机,我只能说ssh store并将其放在store上的web1容器中。

    编辑:

    解决方案:

    正如Jakuje指出的那样,使用带有ssh的ProxyCommand不会允许非ssh进一步命令。因此,我只是使用别名并可能使用bash函数来实现它。我已经设置了两个。

    根据Jakuje在〜/ .ssh / config

    中的推荐
    Host web1
    RequestTTY yes
    

    alias ssh-store="ssh web1 docker exec -ti store /bin/bash"
    

    所以我可以做ssh-store并最终进入容器

    或〜/ .bashrc

    function ssh-web1 { ssh web1 docker exec -ti $1 /bin/bash; }
    

    所以我可以做ssh-web1 store并最终进入容器

1 个答案:

答案 0 :(得分:0)

  

我认为它正在尝试ssh进入商店容器,而不是只执行抛出该错误的命令,这是正确的吗?如果不是什么问题?

  

有没有办法使用ProxyCommand执行此操作而不尝试ssh到容器中,而只是使用docker exec?

没有。它没有这种方式。 ProxyCommand期望另一步也是SSH会话,而不是直接bash提示。

  

将ssh设置到容器中是否容易?我们目前不是这样做的。

我认为这是不必要的开销。但这可能是围绕这里的许多其他问题所描述的。

至少可以通过在-t -t中指定RequestTTY来摆脱~/.ssh/config。但其余的必须是bash别名或函数(如果你有更多主机function更合适)。

function ssh-docker {
    ssh web1 docker exec -ti $1 /bin/bash
}

然后无论像这样的容器都可以调用它:

ssh-docker store

您只需将此功能存储到.bashrc或存储别名的位置。