获取密码到ssh-keygen

我有一个新的私钥,作为bash脚本的一部分,它将作为Docker容器。 将私钥复制到/root/.ssh/id_rsa我想用以下方法重新生成公共密钥:

 ssh-keygen -yf /root/.ssh/id_rsa > /root/.ssh/id_rsa.pub 

不幸的是,这导致了以下错误:

加载失败

我认为这是因为私钥有一个没有提供给ssh-keygen命令的密码,但是我不知道这是怎么回事。 我读过设置SSH_AUTH_SOCK环境variables就足够了,但它不适合我…仍然要求密码。

然后我碰到了使用-x参数的keygen命令的一个小变化:

 ssh-keygen -yf /root/.ssh/id_rsa > /root/.ssh/id_rsa.pub -x 

令我非常吃惊的是它产生了结果。 正确的结果? 不确定。 实际上,结果与非“-x”变体(当提供密码短语时)明显不同。 我看了一下man文件,并没有提到-x

我很困惑。 任何帮助,将不胜感激。 寻找:

  • 更好地理解-x作用以及如何有效地使用它
  • 一种将我的私钥的密码传递给ssh-keygen (也是如此, git也会使用它)

一些使用情况下,将密码作为parameter passing是有道理的,但显然必须注意安全性,所以无论您使用密码或私钥发送密码,请考虑所处环境的背景并非常小心。 在我的情况下,这是我想要实现的:

  • 我有一台主机(在这种情况下运行Ubuntu,但任何基于* nix的解决scheme看起来都差不多
  • 这台机器具有权限(通过SSH)将数据提取(但不能写入)到GitHub和BitBucket上的私人回购站
  • 我正在使用Docker来创build一个存储容器,我想提供的内容,以及提供一些基本的实用function,如能够从回购拉内容,运行和下载任何依赖基于npm [节点], composer [PHP] ,或bower [前端]等。
  • 我遇到的问题是容器将无权与git repos进行交互,即使启动进程(Ubuntu主机) 具有此权限

我的解决scheme是让主机将一个私钥(只有只读访问权限)传递给它创build的任何存储容器。 这样可以让他们按照回购的标准进行投标,如果交易完全没有交互性(也就是说,没有人为的交互),就可能会非常容易。

以下是我所做的工作:

  • Dockerfile中,我从Ubuntu的apt-get包pipe理器中安装了一些重要的依赖项:

     RUN apt-get install -yqq git subversion sshpass \ && apt-get install -yqq nodejs npm \ && npm install -g bower \ && apt-get install -yqq php5 \ 

    大多数情况下,只是为了让各个软件包pipe理人员能够在运行时被调用,但还有其他一些值得一提的东西:

    • sshpass允许我们在交互式调用中注入一个密码
    • subversion你可以忽略这一点,但我有一个与git明显的依赖
  • 然后,在Dockerfile中,我需要确保SSHconfiguration文件指向写密钥,所以我将以下内容附加到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 envvariables以查找代理的命令
    • sshpass包装ssh-add (没有用于传递密码的命令行开关)
    • 从这一点来说,代理应该有caching的SSH密钥,因此调用git应该正确parsing。

请注意使用sudo ,这是一个奇怪的要求,因为我们在Docker容器中以root身份运行,但由于某些原因,仍然需要使其运行。

希望这可以帮助。 乐于采取任何优化build议。 如果任何人有兴趣我的演变Dockerfile可以在: https : //github.com/lifegadget/docker-locker