通过环境变量提供ssh密钥密码

时间:2016-07-13 14:39:04

标签: linux shell ssh ssh-keys ssh-agent

我在我的应用程序中运行带有ssh命令的shell脚本。使用过的私钥是通过密码加密的,问题是 - 我在询问时无法以交互方式传递它。在ssh-agent中没有添加密钥。我无法执行ssh-add my_key,因为密码短语应该以交互方式传递。它对终端通信有好处,但在内部应用程序中使用效果不太好。

man page说:

  

DISPLAY和SSH_ASKPASS

     

如果ssh-add需要密码短语,它将从当前终端读取密码短语,如果它是从终端运行的话。                如果ssh-add没有与之关联的终端但是设置了DISPLAY和SSH_ASKPASS,它将执行                由SSH_ASKPASS指定的程序并打开一个X11窗口来读取密码。这在特别有用时                从.xsession或相关脚本调用ssh-add。 (请注意,在某些计算机上可能需要重定向                来自/ dev / null的输入使其工作。)

当我执行SSH_ASKPASS=file_with_passphrase ssh-add my_key时,我仍然要求输入密码,在这种情况下,env var就会被忽略。我尝试执行ssh -o BatchMode=yes和服务器只是拒绝编码密钥,因为没有人能够解码它。

我绝对可以在ssh-agent中使用之前手动解码ssh密钥,但看起来我要从SSH_ASKPASS变量得到我需要的东西,但我不知道如何制作它工作。很高兴得到社区的帮助。

2 个答案:

答案 0 :(得分:3)

所以实际上有一些事情对你要做的事情很重要:

  1. 必须设置DISPLAY
  2. 它必须没有与之关联的终端
  3. 在某些机器上可能需要重定向来自/ dev / null的输入(我的是其中之一)。
  4. SSH_ASKPASS必须包含一个可执行文件,用于输出stdout上的密码。
  5. 所以有一个让它工作的例子(对我来说,我也应该在其他linux上工作):

    创建虚拟钥匙:

    ssh-keygen -t rsa -C se-so-38354773 -f /tmp/se-so-38354773.key -N 'se-so-38354773-pp'
    

    创建askpass脚本以回显密码文件:

    cat > /tmp/se-so-38354773-askpass <<EOF
    #!/usr/bin/env bash
    echo "${0}:${@} : this is for debugging to see if the echo script runs" 1>&2
    echo "se-so-38354773-pp"
    EOF
    chmod +x /tmp/se-so-38354773-askpass
    

    我将此文件放在/ tmp / - 但这对安全性没有好处,除非您在写入文件之前也更改文件的权限以确保没有其他人可以读取它(或设置umask)。

    然后你可以按照以下步骤进行ssh-add:

    DISPLAY=":0.0" SSH_ASKPASS="/tmp/se-so-38354773-askpass" setsid ssh-add /tmp/se-so-38354773.key </dev/null
    

    如果有setsidssh-add -d /tmp/se-so-38354773.key rm /tmp/se-so-38354773* 会将其与您的终端分离 - 虽然我的计算机上不需要这样做 - 但是 - 我认为在某些其他情况下可能需要它。

    当你完成测试时,请进行清理:

    iwana@iwana-nb.concurrent.co.za:~/projects/gitlab.com/aucampia/stackexchange/stackoverflow/38354773
    $ ssh-keygen -t rsa -C se-so-38354773 -f /tmp/se-so-38354773.key -N 'se-so-38354773-pp'
    Generating public/private rsa key pair.
    Your identification has been saved in /tmp/se-so-38354773.key.
    Your public key has been saved in /tmp/se-so-38354773.key.pub.
    The key fingerprint is:
    SHA256:s+jVUPEyb2DzRM5y+Hm3XDzVRREKn5yU2d0hk61hIQ0 se-so-38354773
    The key's randomart image is:
    +---[RSA 2048]----+
    |          .E+=B=O|
    |           B*B*o=|
    |          X B*o o|
    |         o % o ..|
    |        S   * ..+|
    |       . = . ...+|
    |      . o .    o |
    |     . .         |
    |      .          |
    +----[SHA256]-----+
    iwana@iwana-nb.concurrent.co.za:~/projects/gitlab.com/aucampia/stackexchange/stackoverflow/38354773
    $ 
    iwana@iwana-nb.concurrent.co.za:~/projects/gitlab.com/aucampia/stackexchange/stackoverflow/38354773
    $ cat > /tmp/se-so-38354773-askpass <<EOF
    > #!/usr/bin/env bash
    > echo "${0}:${@} : this is for debugging to see if the echo script runs" 1>&2
    > echo "se-so-38354773-pp"
    > EOF
    iwana@iwana-nb.concurrent.co.za:~/projects/gitlab.com/aucampia/stackexchange/stackoverflow/38354773
    $ chmod +x /tmp/se-so-38354773-askpass
    iwana@iwana-nb.concurrent.co.za:~/projects/gitlab.com/aucampia/stackexchange/stackoverflow/38354773
    $ 
    iwana@iwana-nb.concurrent.co.za:~/projects/gitlab.com/aucampia/stackexchange/stackoverflow/38354773
    $ DISPLAY=":0.0" SSH_ASKPASS="/tmp/se-so-38354773-askpass" setsid ssh-add /tmp/se-so-38354773.key </dev/null
    iwana@iwana-nb.concurrent.co.za:~/projects/gitlab.com/aucampia/stackexchange/stackoverflow/38354773
    $ 
    bash: : this is for debugging to see if the echo script runs
    Identity added: /tmp/se-so-38354773.key (/tmp/se-so-38354773.key)
    iwana@iwana-nb.concurrent.co.za:~/projects/gitlab.com/aucampia/stackexchange/stackoverflow/38354773
    $ ssh-add -d /tmp/se-so-38354773.key
    Identity removed: /tmp/se-so-38354773.key (se-so-38354773)
    iwana@iwana-nb.concurrent.co.za:~/projects/gitlab.com/aucampia/stackexchange/stackoverflow/38354773
    $ rm /tmp/se-so-38354773*
    

    我计算机上的输出示例:

    {{1}}

答案 1 :(得分:0)

在将密钥发送到 ssh-add 之前,我使用 openssl 对其进行解密。

echo "$MY_PASSPHRASE" | openssl rsa -in my_encrypted_key -passin stdin | ssh-add -