【发布时间】:2020-11-10 16:54:36
【问题描述】:
我在 GitHub Actions 中遇到了一个最奇怪的错误,我已经尝试解决了几个小时,但我完全没有想法。
我目前使用一个非常简单的 GitHub Action。最终目标是在其他工作流程中通过 ssh 运行特定的 bash 命令。
Dockerfile:
FROM ubuntu:latest
COPY entrypoint.sh /entrypoint.sh
RUN apt update && apt install openssh-client -y
RUN chmod +x entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
entrypoint.sh:
#!/bin/sh
mkdir -p ~/.ssh/
echo "$1" > ~/.ssh/private.key
chmod 600 ~/.ssh/private.key
echo "$2" > ~/.ssh/known_hosts
echo "ssh-keygen"
ssh-keygen -y -e -f ~/.ssh/private.key
echo "ssh-keyscan"
ssh-keyscan <IP>
ssh -i ~/.ssh/private.key -tt <USER>@<IP> "echo test > testfile1"
echo "known hosts"
cat ~/.ssh/known_hosts
wc -m ~/.ssh/known_hosts
action.yml
name: "SSH Runner"
description: "Runs bash commands in remote server via SSH"
inputs:
ssh_key:
description: 'SSH Key'
known_hosts:
description: 'Known Hosts'
runs:
using: 'docker'
image: 'Dockerfile'
args:
- ${{ inputs.ssh_key }}
- ${{ inputs.known_hosts }}
同一仓库中的当前工作流文件:
on: [push]
jobs:
try-ssh-commands:
runs-on: ubuntu-latest
name: SSH MY_TEST
steps:
- name: Checkout
uses: actions/checkout@v2
- name: test_ssh
uses: ./
with:
ssh_key: ${{secrets.SSH_PRIVATE_KEY}}
known_hosts: ${{secrets.SSH_KNOWN_HOSTS}}
在 github 操作在线控制台中,我得到以下输出:
ssh-keygen
---- BEGIN SSH2 PUBLIC KEY ----
Comment: "2048-bit RSA, converted by root@844d5e361d21 from OpenSSH"
AAAAB3NzaC1yc2EAAAADAQABAAABAQDaj/9Guq4M9V/jEdMWFrnUOzArj2AhneV3I97R6y
<...>
9f/7rCMTJwae65z5fTvfecjIaUEzpE3aen7fR5Umk4MS925/1amm0GKKSa2OOEQnWg2Enp
Od9V75pph54v0+cYfJcbab
---- END SSH2 PUBLIC KEY ----
ssh-keyscan
# <IP>:22 SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3
# <IP>:22 SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3
# <IP>:22 SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3
# <IP>:22 SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3
# <IP>:22 SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3
<IP> ssh-ed25519 AAAAC3NzaC1lZD<...>9r5SNohBUitk
<IP> ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDRNWiDWO65SKQnYZafcnkVhWKyxxi5r+/uUS2zgYdXvuZ9UIREw5sumR95kbNY1V90<...>
qWXryZYaMqMiWlTi6ffIC5ZoPcgGHjwJRXVmz+jdOmdx8eg2llYatRQbH7vGDYr4zSztXGM77G4o4pJsaMA/
***
Host key verification failed.
known hosts
***
175 /github/home/.ssh/known_hosts
据我了解,*** 用于替换 GitHub 机密,在我的情况下,它是已知主机的密钥。得到*** 作为ssh-keyscan 的结果和 cat known_host 应该意味着known_hosts 文件是正确的并且应该可以建立连接。因为在这两种情况下,控制台输出都被 GitHub 成功审查。由于该文件包含 175 个字符,我可以假设它包含实际的密钥。但是正如人们所看到的那样,脚本失败了Host key verification failed。
当我在另一个工作流程中使用完全相同的输入数据手动执行相同的步骤时,我成功了。来自我的本地计算机的 ssh 也是如此,具有相同的 private_key 和 known_host 文件。
例如,这适用于完全相同的秘密
- name: Create SSH key
run: |
mkdir -p ~/.ssh/
echo "$SSH_PRIVATE_KEY" > ../private.key
sudo chmod 600 ../private.key
echo "$SSH_KNOWN_HOSTS_PROD" > ~/.ssh/known_hosts
shell: bash
env:
SSH_PRIVATE_KEY: ${{secrets.SSH_PRIVATE_KEY}}
SSH_KNOWN_HOSTS: ${{secrets.SSH_KNOWN_HOSTS}}
- name: SSH into DO and run
run: >
ssh -i ../private.key -tt ${SSH_USERNAME}@${SERVER_IP}
"
< commands >
"
在entrypoint.sh 中的ssh 命令上使用 -o "StrictHostKeyChecking no" 标志也有效。但出于安全原因,我想避免这种情况。
我已经尝试解决这个问题几个小时,但我似乎错过了一个关键细节。有没有人遇到过类似的问题或知道我做错了什么?
【问题讨论】:
-
你是如何确定 ${{secrets.SSH_KNOWN_HOSTS}} 中的值的?
-
你这是什么意思?通常 Github 会审查你的秘密。因此,如果您不知道您的秘密是什么(例如,如果您丢失了它),但您想检索该值,您可以尝试将其写入文件并从中创建一个 github 工件。然后您应该可以通过网络界面下载它。如果这不是您的意思,请详细说明您的问题。
标签: docker ssh continuous-integration continuous-deployment github-actions