获取 ssh-keygen 的密码

获取 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 环境变量就足够了,但对我来说没用……仍然要求输入密码。

然后我遇到了使用以下参数的 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 主机)有此权限

我的解决方案是让主机将私钥(仅具有只读访问权限)传递给它创建的任何存储容器。这将允许他们使用存储库执行他们的命令,如果不是因为它要求交换完全非交互式(即没有人为交互),这可能非常简单。

以下是我为使它发挥作用所做的事情:

  • 在里面Dockerfileapt-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

相关内容