我有一个新的私钥,我将把它作为 bash 脚本的一部分带到 docker 容器中。将私钥复制到后,/root/.ssh/id_rsa
我想使用以下命令重新生成公钥:
ssh-keygen -yf /root/.ssh/id_rsa > /root/.ssh/id_rsa.pub
不幸的是这会导致以下错误:
加载失败
我认为这是因为私钥有一个密码,但ssh-keygen
命令中没有提供该密码,但遗憾的是我不知道该怎么做。我读到过设置 SSH_AUTH_SOCK 环境变量就足够了,但对我来说没用……仍然要求输入密码。
然后我遇到了使用以下参数的 keygen 命令的一个小变体-x
:
ssh-keygen -yf /root/.ssh/id_rsa > /root/.ssh/id_rsa.pub -x
令我惊讶的是,它产生了结果。正确的结果?不确定。事实上,结果与非“-x”变体(当提供密码时)明显不同。我查看了男人-x
文件,但根本没有提及。
我很困惑。任何帮助我都会很感激。正在寻找:
- 更好地理解它的
-x
作用以及如何有效地使用它 - 一种传递我的私钥密码的方法
ssh-keygen
(并且也会git
使用它)
答案1
那里是在某些情况下,将密码作为参数传递是有意义的,但显然必须注意安全性,因此无论您发送密码还是私钥,请考虑您所处情况的背景并非常小心。 就我而言,这是我试图实现的目标:
- 我有一台主机(在这种情况下运行 Ubuntu,但任何基于 *nix 的解决方案看起来都类似
- 这台机器有权限——通过 SSH——将数据拉取(但不能写入)到 GitHub 和 BitBucket 上的私有存储库
- 我在用Docker创建一个存储容器,我希望它提供内容以及一些基本的实用功能,比如能够从 repo 中提取内容,运行和下载基于
npm
[node]、composer
[php] 或bower
[frontend] 等的任何依赖项。 - 我遇到的问题是容器不是有权限与 git repos 进行交互,即使将其踢出的过程(Ubuntu 主机)做有此权限
我的解决方案是让主机将私钥(仅具有只读访问权限)传递给它创建的任何存储容器。这将允许他们使用存储库执行他们的命令,如果不是因为它要求交换完全非交互式(即没有人为交互),这可能非常简单。
以下是我为使它发挥作用所做的事情:
在里面Dockerfile
apt-get
我从 Ubuntu 的包管理器安装了几个重要的依赖项:RUN apt-get install -yqq git subversion sshpass \ && apt-get install -yqq nodejs npm \ && npm install -g bower \ && apt-get install -yqq php5 \
其中大部分只是为了让各种包管理器到位,以便可以在运行时调用它们,但还有一些值得一提的:
sshpass
允许我们在交互式通话中注入密码subversion
你可能可以忽略这一点,但我对它有依赖,而且对 git 也有明显的依赖
然后也在Dockerfile我需要确保 SSH 配置文件指向写入密钥,因此我将以下内容附加到 ssh_config 文件中。这是 Ubuntu 所必需的,但某些 *nix 版本可能不需要。
RUN { \ echo ""; \ echo "IdentityFile /root/.ssh/id_rsa"; \ } >> /etc/ssh/ssh_config
容器在主机上使用以下命令启动:
sudo docker run --name foobar \ -e PREP="['composer.phar install','bower update']" \ -e PRIVATE_KEY="$(< ~/.ssh/id_rsa_nopass)" \ -e PASSWORD="" \ "lifegadget/docker-locker" \ load [email protected]:loginname/repo.git
现在在运行时——即在执行上述命令后设置存储容器时——您会立即获得主机的私钥,如果密钥上没有密码,这就是所需的全部。如果有密码,事情就会变得更有趣。以下代码与之抗衡:
sudo ssh-agent -a /tmp/agent.sock export SSH_AUTH_SOCK=/tmp/agent.sock sshpass -p$PASSWORD sudo ssh-add /root/.ssh/id_rsa ssh-keygen -yf /root/.ssh/id_rsa > /root/.ssh/id_rsa.pub
基本上发生的事情是:
- 设置一个监听命名 unix 套接字的 SSH 代理
- 设置命令的 SSH_AUTH_SOCK 环境变量来查找代理
- 将
ssh-add
(没有用于传递密码的命令行开关)包装为sshpass
- 从此时起,代理应该缓存 SSH 密钥,因此对 git 的调用应该可以正确解析。
请注意的使用
sudo
,这是一个奇怪的要求,因为我们在 Docker 容器中以 root 身份运行,但由于某种原因,仍然需要它才能使其工作。
希望这能有所帮助。很高兴接受任何有关优化的建议。如果有人感兴趣,我的不断发展的 Dockerfile 可以在以下位置找到:https://github.com/lifegadget/docker-locker
肯