代码之家  ›  专栏  ›  技术社区  ›  rtacconi

将SSH中的私钥指定为字符串

  •  46
  • rtacconi  · 技术社区  · 12 年前

    我可以使用-I选项指定私钥,通过SSH连接到服务器:

    ssh -i ~/.ssh/id_dsa user@hostname
    

    我正在创建一个脚本 id_dsa 来自数据库的文本,但我不确定如何将该字符串提供给SSH。我需要这样的东西:

    ssh --option $STRING user@hostname
    

    哪里 $STRING 包含的值 id_dsa 。我需要知道 --option 如果有的话。

    4 回复  |  直到 12 年前
        1
  •  50
  •   user2132025    11 年前

    请尝试以下操作:

    echo $KEY | ssh -i /dev/stdin username@host command
    

    密钥不会出现在PS语句中,但由于stdin被重定向,因此它只对单个命令或隧道有用。

        2
  •  15
  •   Kimvais    12 年前

    没有这样的开关,因为它会泄露敏感信息。如果有的话, 任何人 可以得到你的 私有的 通过做一个简单的键 ps 命令

    编辑 :(因为在评论中添加了详细信息)

    您确实应该将密钥存储到一个临时文件中。如果不使用以下命令,请确保在写入文件之前正确设置了权限 mktemp 以创建临时文件。

    请确保运行代理(或OpenSSH中的代理)进程,并使用 <whatever command you use to fetch it form the database> | ssh-add -

        3
  •  2
  •   SAGAR BHOOSHAN    5 年前

    将密钥作为字符串传递是不可取的,但为了解决这个问题,我想说我遇到了同样的情况,需要将密钥作为脚本中的字符串传递。我也可以使用存储在文件中的密钥,但脚本的本质是使其非常灵活,需要包含所有内容。所以我习惯于分配变量,并按如下方式传递和回显它:

    #!/bin/bash
    KEY="${ YOUR SSH KEY HERE INSIDE }"
    echo "${KEY}" | ssh -q -i /dev/stdin username@IP 'hostnamectl'
    exit 0
    

    注意事项: -q 取消显示所有警告

    顺便说一句,上面脚本中的catch,由于我们使用echo,它将打印ssh密钥,这也是不推荐的,以隐藏您可以使用grep来grep一些肯定不会打印但仍然可以打印的东西 stdin 将具有来自回波的值。因此,最终cmd可以修改如下:

    #!/bin/bash
    KEY="${ YOUR SSH KEY HERE INSIDE }"
    echo "${KEY}" | grep -qw "less" | ssh -q -i /dev/stdin username@IP 'hostnamectl'
    exit 0
    

    这对我很管用。

        4
  •  1
  •   Kruzchy Klaperman    2 年前

    我在看同样的问题。正在将私钥内容添加到 ssh 通过stdin的命令对我不起作用。我发现可以将私钥文件内容添加到 ssh-agent 使用命令 ssh-add 。这会让你 ssh公司 到远程主机,而不显式指定标识文件。我的特殊用例是,我不想在我的机器上以明文形式存储SSH密钥,而是从秘密保险库中动态获取它。这个答案主要是StackOverflow上其他答案的集合。

    ssh代理是一个用于保存用于公钥的私钥的程序 身份验证。通过使用环境变量,代理可以 在登录时定位并自动用于身份验证 使用ssh连接到其他计算机

    Source

    这就是我所做的。 首先启动 ssh代理
    您可以从您的终端启动它,只需执行 ssh代理
    可选: 如果你想确定 ssh代理 在每次登录时都运行,您可以在shell配置中添加以下内容。 这是我添加到 ~/.bashrc 文件

    # set SSH_AUTH_SOCK env var to a fixed value
    export SSH_AUTH_SOCK=~/.ssh/ssh-agent.sock
    
    # test whether $SSH_AUTH_SOCK is valid
    ssh-add -l 2>/dev/null >/dev/null
    
    # if not valid, then start ssh-agent using $SSH_AUTH_SOCK
    [ $? -ge 2 ] && ssh-agent -a "$SSH_AUTH_SOCK" >/dev/null
    

    Source (这个特定的代码片段还确保在已经有ssh代理进程在运行时不会创建新的ssh代理进程。)

    现在你有了 ssh代理 跑步 由于我们对将SSH密钥作为字符串加载感兴趣,因此我将假设一个场景,其中私钥内容已经加载到变量中, $SSH_PRIVATE_KEY

    我现在可以将此密钥内容添加到 ssh代理 通过执行以下命令。

    ssh-add - <<< "${SSH_PRIVATE_KEY}"
    

    这也可以添加到bashrc文件中。 您可以通过执行列出所有密钥来确认您的密钥已添加 ssh-agent -l 。啊,你现在完了。

    尝试连接到远程主机,您不需要私钥文件。

    ssh username@hostname
    

    这确实带来了额外的安全风险。以下是我能想到的:

    1. 将私钥添加到ssh代理将允许机器上的任何进程访问该密钥以对远程主机进行身份验证,而无需明确提供任何信息。
    2. 由于目标是将私钥加载为字符串,因此它要么存储在变量中,要么直接嵌入命令中。这可能会使密钥在命令历史记录、shell变量和其他位置可用。