49

我有一个相当基本的场景。为此,我制作了一个专用的 ssh 密钥并将其添加到我的存储库机密中。

  1. 代码被推送到master

  2. sshGitHub 操作使用by doing将其上传到服务器echo "${{ secrets.SSH_KEY }}" > key

  3. 之后,我可以使用此密钥连接到我的服务器,例如ssh -i key devops@myserver.com lsb_release -a

问题是由于某种原因 GitHub 操作无法将其写入文件,它会将字符***而不是实际的秘密值写入文件。因此显然我无法连接到我的服务器。

如何使用此密码连接 ssh?有没有不使用文件的连接方式?使用 GitHub 操作完成此常见场景的人能否提供一些启示?

4

4 回答 4

68

GitHub Actions 应该能够以这种方式将秘密写入文件。您看到星号的原因是日志已被过滤,因此如果要记录秘密,则会在日志中将其替换为三个星号。这是一种防止意外泄露机密的安全措施,因为日志通常是公开的。

但是,如果可能的话,最好避免将秘密写入日志。您可以像这样编写命令,这样您就不会将秘密写入日志:

    - run: 'echo "$SSH_KEY" > key'
      shell: bash
      env:
        SSH_KEY: ${{secrets.SSH_KEY}}

您将在日志中看到的只是echo "$SSH_KEY" > key,而不是秘密或任何星号。

请注意,您确实需要在此处使用引号,因为该>字符对于 YAML 来说是特殊的。

如果这无法登录到您的服务器,则可能存在不同的问题;在一般情况下,这种技术确实适用于编写机密。

于 2019-12-25T21:58:56.337 回答
12

我找到了一种方法来做到这一点。我们在一个项目中使用了 GatsbyJS,它依赖于 .env.production 文件来存储环境变量。我试图将它们传递 env:给 github 操作,但这不起作用,它们被忽略了。

这就是我所做的。我对 .env.production 文件进行了 base 64 编码:

base64 -i .env.production

将输出添加到 github 操作中的 env 变量。然后在我的行动中,我这样做:

echo ${{ secrets.ENV_PRODUCTION_FILE }} | base64 -d > .env.production

这样,我的 .env.production 文件的内容就被写入执行 github 操作的机器。

于 2021-03-12T15:47:17.567 回答
1

好的解决方案是使用 gpg 加密密钥,将其添加到 repo 并使用密码在服务器上解密。passprase 当然应该存储为 github 项目机密。

更多信息我是如何在这里做到的:https ://help.github.com/en/actions/automating-your-workflow-with-github-actions/creating-and-using-encrypted-secrets

于 2019-12-25T22:18:40.550 回答
0

以下是如何使用存储在 GitHub Actions 中的秘密(名为GITHUB_ACTIONS_DEPLOY.

我们称之为“哔”,因为它会在您登录的服务器上引起响铃。当有人将代码推送到您的存储库时,您可能会使用这种方式 ping 您家中的服务器。

      - name: Beep    
        # if: github.ref == 'refs/heads/XXXX' # Maybe limit only this step to some branches
        run: |
          eval $(ssh-agent)
          ssh-add - <<< "$SSH_KEY"
          echo "* ssh-rsa XXX" >> /tmp/known_hosts # Get from your local ~/.ssh/known_hosts or from ssh-keyscan
          ssh -o UserKnownHostsFile=/tmp/known_hosts user@example.com "echo '\a'"
        env:
          SSH_KEY: ${{ secrets.PMT_GITHUB_ACTIONS_DEPLOY }}

如果实际上您使用 SSH 作为 rsync 推送任务的一部分,请执行以下操作:

      - name: Publish    
        if: github.ref == 'refs/heads/XXX'
        run: |
          eval $(ssh-agent)
          ssh-add - <<< "$SSH_KEY"
          echo "* ssh-rsa XXX" >> /tmp/known_hosts
          rsync $FROM user@server:
        env:
          SSH_KEY: ${{ secrets.GITHUB_ACTIONS_DEPLOY }}
          RSYNC_RSH: "ssh -o UserKnownHostsFile=/tmp/known_hosts"
于 2021-04-27T20:56:03.400 回答