我有一个新的私钥,作为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是有道理的,但显然必须注意安全性,所以无论您使用密码或私钥发送密码,请考虑所处环境的背景并非常小心。 在我的情况下,这是我想要实现的:
npm [节点], composer [PHP] ,或bower [前端]等。 我的解决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
基本上发生了什么事情是:
sshpass包装ssh-add (没有用于传递密码的命令行开关) 请注意使用
sudo,这是一个奇怪的要求,因为我们在Docker容器中以root身份运行,但由于某些原因,仍然需要使其运行。
希望这可以帮助。 乐于采取任何优化build议。 如果任何人有兴趣我的演变Dockerfile可以在: https : //github.com/lifegadget/docker-locker
肯