代码被推送到
master
Github操作使用
ssh
将其上传到服务器,方法是执行echo "${{ secrets.SSH_KEY }}" > key
。之后,我可以使用此密钥连接到我的服务器,例如:
ssh -i key devops@myserver.com lsb_release -a
***
而不是实际秘密值写入文件。因此,显然我无法连接到我的服务器。如何使用此密钥进行ssh连接?是否有一种不使用文件的方法进行连接?是否有人使用GitHub操作完成这种常见场景并能提供帮助?
代码被推送到master
Github操作使用ssh
将其上传到服务器,方法是执行echo "${{ secrets.SSH_KEY }}" > key
。
之后,我可以使用此密钥连接到我的服务器,例如:ssh -i key devops@myserver.com lsb_release -a
***
而不是实际秘密值写入文件。因此,显然我无法连接到我的服务器。这是如何通过GitHub Actions将一个秘密写入文件的方法。如果在日志中记录了该秘密,将用三个星号替换它,这是一种针对意外泄露机密的安全措施,因为日志通常是公开的,所以你看到星星。
然而,如果可能的话,最好避免将秘密写入日志。你可以像这样编写命令,以便不将秘密写入日志:
- run: 'echo "$SSH_KEY" > key'
shell: bash
env:
SSH_KEY: ${{secrets.SSH_KEY}}
在日志中你只会看到 echo "$SSH_KEY" > key
,而不是密码或任何星号。
请注意,在这里你确实需要引号,因为 >
字符对于YAML来说是特殊的。
如果这不能让你登录服务器,那么可能有不同的问题;通常情况下,这种技术可以用于写入密码。
echo "$SSH_KEY"
。重要的是转义多行字符。 - Shinebayar Grun
为 'echo "$SSH_KEY" > key && tail key'
,但仍显示 ***
。操作运行程序如何知道文件应该仍然加密? - Dida我找到了一种方法来实现这个。我们在一个项目中使用了 GatsbyJS,它依赖于一个 .env.production 文件来存储环境变量。我试图将它们作为 env:
传递给 Github Action,但是失败了,被忽略了。
这是我做的事情。我对 .env.production 文件进行了 base64 编码:
base64 -i .env.production
在 Github Action 中将输出添加到环境变量中。然后在我的操作中执行:
echo ${{ secrets.ENV_PRODUCTION_FILE }} | base64 -d > .env.production
这样一来,我的.env.production文件的内容就被写入了执行github action的机器上。
你可以通过在 Python shell 中循环遍历 secret
来解码它,就像这样:
- name: Set env as secret
env:
MY_VAL: ${{ secrets.SUPER_SECRET }}
run: |
import os
data = open("file", "w")
for q in (os.getenv("MY_VAL")):
print(q)
data.write(q)
shell: python
这将会同时将每个字符打印到标准输出和存储在名为file
的文件中。stdout
的输出应该像这样,而文件中应该保存着秘密字符串。
s
e
c
r
e
t
它每天在我的存储库上运行,以检查它是否仍在工作:这里
print q
改为 print(q)
。 - tjheslin1对其进行编码和解码
- run: 'echo "$SSH_KEY" | base64'
shell: bash
env:
SSH_KEY: ${{ secrets.PRIVATE_KEY }}
并将其解码:echo "<编码字符串>" | base64 -d
run: |-
sed -i "s/TOKEN/${{secrets.MY_SECRET}}/g" "thefile"
credentials "app.terraform.io" {
token = "TOKEN"
}
echo ${{secrets.AWS_ACCESS_KEY_ID}} | sed 's/./& /g'
GITHUB_ACTIONS_DEPLOY
)安全登录到 SSH 服务器。 - 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 }}
- 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"