使用带有docker的ssh-agent

时间:2014-11-20 10:13:42

标签: ssh docker boot2docker

我想使用ssh-agent将我的密钥转发到docker镜像并从私有github仓库中提取。

我在Yosemite上使用了https://github.com/phusion/passenger-docker的略微修改版本和boot2docker。

ssh-add -l
...key details
boot2docker up

然后我使用我在很多地方看到的命令(即https://gist.github.com/d11wtq/8699521):

docker run --rm -t -i -v $SSH_AUTH_SOCK:/ssh-agent -e SSH_AUTH_SOCK=/ssh-agent my_image /bin/bash

但它似乎不起作用:

root@299212f6fee3:/# ssh-add -l
Could not open a connection to your authentication agent.

root@299212f6fee3:/# eval `ssh-agent -s`
Agent pid 19

root@299212f6fee3:/# ssh-add -l
The agent has no identities.

root@299212f6fee3:/# ssh git@github.com
Warning: Permanently added the RSA host key for IP address '192.30.252.128' to the list of known hosts.
Permission denied (publickey).

8 个答案:

答案 0 :(得分:5)

单行:

以下是如何在运行Debian Jessie图像的Ubuntu 16上进行设置:

SELECT *
FROM
  (
  SELECT TRUNC(sysdate,'MM') + (level - 1) ,
  level AS lvl ,
  mod(level,:turnus) filter   
  FROM dual
     CONNECT BY level <= last_day(sysdate) + 1 - TRUNC(sysdate,'MM')
  ORDER BY level
  )   
WHERE filter = 0;

https://techtip.tech.blog/2016/12/04/using-ssh-agent-forwarding-with-a-docker-container/

答案 1 :(得分:4)

我扩展了@ wilwilson的答案,并创建了一个脚本,用于在OSX boot2docker环境中设置代理转发。

https://gist.github.com/rcoup/53e8dee9f5ea27a51855

#!/bin/bash

# Use a unique ssh socket name per-invocation of this script
SSH_SOCK=boot2docker.$$.ssh.socket

# ssh into boot2docker with agent forwarding
ssh -i ~/.ssh/id_boot2docker \
    -o StrictHostKeyChecking=no \
    -o IdentitiesOnly=yes \
    -o UserKnownHostsFile=/dev/null \
    -o LogLevel=quiet \
    -p 2022 docker@localhost \
    -A -M -S $SSH_SOCK -f -n \
    tail -f /dev/null

# get the agent socket path from the boot2docker vm
B2D_AGENT_SOCK=$(ssh -S $SSH_SOCK docker@localhost echo \$SSH_AUTH_SOCK)

# mount the socket (from the boot2docker vm) onto the docker container
# and set the ssh agent environment variable so ssh tools pick it up
docker run \
    -v $B2D_AGENT_SOCK:/ssh-agent \
    -e "SSH_AUTH_SOCK=/ssh-agent" \
    "$@"

# we're done; kill off the boot2docker ssh agent
ssh -S $SSH_SOCK -O exit docker@localhost

将其粘贴在~/bin/docker-run-sshchmod +x中,然后使用docker-run-ssh代替docker run

答案 2 :(得分:4)

2.2.0.0版开始,用于macOS的docker允许用户访问容器内主机的SSH代理。

下面是一个示例命令,让您执行以下操作:

docker run --rm -it \
-v /run/host-services/ssh-auth.sock:/ssh-agent \
-e SSH_AUTH_SOCK="/ssh-agent" \
my_image

请注意,您必须像在Linux主机上那样安装特定路径(/run/host-services/ssh-auth.sock)而不是$SSH_AUTH_SOCK环境变量中包含的路径。

答案 3 :(得分:1)

我访问ssh-agent以转发在OSX Mavericks和docker 1.5上运行的密钥如下:

  1. 使用boot2docker ssh -A ssh进入boot2docker VM。不要忘记使用选项-A,它可以转发身份验证代理连接。

  2. 在boot2docker ssh会话中:

    docker@boot2docker:~$ echo $SSH_AUTH_SOCK
    /tmp/ssh-BRLb99Y69U/agent.7750
    
  3. 此会话必须保持打开状态。记下SSH_AUTH_SOCK环境变量的值。

    1. 在另一个OS X终端中,使用步骤2中的SSH_AUTH_SOCK值发出docker run命令,如下所示:

      docker run --rm -t -i \
        -v /tmp/ssh-BRLb99Y69U/agent.7750:/ssh-agent \
        -e SSH_AUTH_SOCK=/ssh-agent my_image /bin/bash
      root@600d0e9b443d:/# ssh-add -l
      2048 6c:8e:82:08:74:33:78:61:f9:9a:74:1b:65:46:be:eb         
      /Users/dev/.ssh/id_rsa (RSA)
      
    2. 我真的不喜欢这样一个事实:我必须保持boot2docker ssh会话打开以使其工作,但是直到找到更好的解决方案,这至少对我有用。

答案 4 :(得分:1)

我遇到了类似的问题,并且通过在主模式下使用ssh和控制套接字并将其全部包装在这样的脚本中,能够使事情变得非常无缝:

#!/bin/sh   

ssh -i ~/.vagrant.d/insecure_private_key -p 2222 -A -M -S ssh.socket -f docker@127.0.0.1 tail -f /dev/null

HOST_SSH_AUTH_SOCK=$(ssh -S ssh.socket docker@127.0.0.1 env | grep "SSH_AUTH_SOCK" | cut -f 2 -d =)

docker run -v $HOST_SSH_AUTH_SOCK:/ssh-agent \
       -e "SSH_AUTH_SOCK=/ssh-agent" \
       -t hello-world "$@"

ssh -S ssh.socket -O exit docker@127.0.0.1

不是宇宙中最漂亮的东西,但比手动保持SSH会话打开IMO要好得多。

答案 5 :(得分:0)

套接字转发在OS X上尚不可用。这是使用 Docker for Mac 而不是现在已经过时的 boot2docker 引入到2019年的@henrjk答案的一种变体。

  1. 首先在容器中运行ssh服务器,/ tmp在可导出卷上。像这样

     docker run -v tmp:/tmp -v \
     ${HOME}/.ssh/id_rsa.pub:/root/.ssh/authorized_keys:ro \
     -d -p 2222:22 arvindr226/alpine-ssh
    
  2. 然后通过代理程序转发到该容器中

     ssh -A -p 2222 root@localhost
    
  3. 在该ssh会话中查找ssh-agent的当前套接字

     3f53fa1f5452:~# echo $SSH_AUTH_SOCK
     /tmp/ssh-9zjJcSa3DM/agent.7
    
  4. 现在您可以运行您的真实容器了。只需确保将下面的SSH_AUTH_SOCK的值替换为您在上面的步骤中获得的值

     docker run -it -v tmp:/tmp  \
     -e SSH_AUTH_SOCK=/tmp/ssh-9zjJcSa3DM/agent.7 \
     vladistan/ansible
    

答案 6 :(得分:0)

  

无法打开与身份验证代理的连接。

此错误occurs when $SSH_AUTH_SOCK env var在主机上设置不正确或根本没有设置。您可以尝试多种解决方法。我的建议是dual-boot Linux and macOS

其他资源:

答案 7 :(得分:-1)

默认情况下,boot2docker仅共享/Users下的文件。 SSH_AUTH_SOCK可能位于/tmp之下,因此-v会安装虚拟机的代理,而不是来自您的虚拟机的代理。

如果您设置VirtualBox以共享/tmp,它应该正常工作。