在macOS上使用ssh-agent和docker

guykilcj  于 2023-05-06  发布在  Docker
关注(0)|答案(8)|浏览(248)

我想使用ssh-agent将我的密钥转发到docker镜像中,并从私有github仓库中提取。
我在约塞米蒂上使用了一个稍微修改过的https://github.com/phusion/passenger-docker版本和boot 2docker。

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).
rfbsl7qr

rfbsl7qr1#

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

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

a0zr77ik

a0zr77ik2#

一句俏皮话:
以下是如何在运行Debian杰西映像的Ubuntu 16上设置它:

docker run --rm -it --name container_name \
-v $(dirname $SSH_AUTH_SOCK):$(dirname $SSH_AUTH_SOCK) \
-e SSH_AUTH_SOCK=$SSH_AUTH_SOCK my_image

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

6yt4nkrj

6yt4nkrj3#

我扩展了@wilwilson的答案,并创建了一个脚本,将在OSX boot 2docker环境中设置代理转发。
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

i2byvkas

i2byvkas4#

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

#!/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要好得多。

ubbxdtey

ubbxdtey5#

对于我来说,访问ssh-agent来转发密钥在OSX Mavericks和docker 1.5上工作如下:
1.使用boot2docker ssh -A将ssh导入boot 2docker虚拟机。不要忘记使用选项-A,它启用身份验证代理连接的转发。
1.在boot 2docker ssh会话中:

docker@boot2docker:~$ echo $SSH_AUTH_SOCK
/tmp/ssh-BRLb99Y69U/agent.7750

此会话必须保持打开状态。注意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)

我真的不喜欢这样的事实,我必须保持一个boot 2docker ssh会话打开,以使这一工作,但直到找到一个更好的解决方案,这至少为我工作。

yc0p9oo0

yc0p9oo06#

套接字转发在OS X上还不起作用。以下是2019年引入的@henrjk答案的变体,使用 Docker for Mac 而不是 * boot 2docker *,后者现已过时。
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

1.然后通过代理转发将ssh放入这个容器中

ssh -A -p 2222 root@localhost

1.在这个ssh会话中找出ssh-agent的当前套接字

3f53fa1f5452:~# echo $SSH_AUTH_SOCK
 /tmp/ssh-9zjJcSa3DM/agent.7

1.现在您可以运行真实的的容器了。只需确保将下面的SSH_AUTH_SOCK的值替换为您在上面步骤中获得的值

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

2eafrhcq7#

默认情况下,boot2docker只共享/Users下的文件。SSH_AUTH_SOCK可能在/tmp下,因此-v装载VM的代理,而不是Mac上的代理。
如果你将VirtualBox设置为共享/tmp,它应该可以工作。

4bbkushb

4bbkushb8#

无法打开与身份验证代理的连接。
此错误occurs when$SSH_AUTH_SOCK env var在主机上设置不正确或根本未设置。您可以尝试各种变通方法。我的建议是dual-boot Linux and macOS
其他资源:

相关问题