Skip to content

GitHub Actions 中的 SSH Known Hosts 警告处理指南

更新: 2025/5/23 字数: 0 字 时长: 0 分钟

在使用 GitHub Actions 进行自动化任务时,尤其是使用 SSH 连接到远程服务器的操作,可能会遇到类似以下的警告:

log
Warning: Permanently added '***' (ECDSA) to the list of known hosts.

背景

当通过 SSH 首次连接到一个远程服务器时,SSH 客户端会从远程服务器获取该服务器的公钥,并将其保存到客户端的 known_hosts 文件中。这是为了确保后 续连接时能验证远程服务器的身份,避免中间人攻击。

在 GitHub Actions 中运行 SSH 操作时,如果没有提前配置远程服务器的主机指纹,就会自动将其加入到运行环境中的 known_hosts 文件中,这会触发上述 警告。尽管这是一个安全机制,然而在 CI/CD 环境中,这样的警告可能会影响任务的正常执行。

解决方案

为了避免此类警告并确保安全地连接到远程服务器,我们可以在工作流中显式地将远程服务器的 SSH 主机密钥提前添加到 known_hosts 文件。

方法一:使用 ssh-keyscan 预先添加主机密钥(推荐)

通过 ssh-keyscan 命令,我们可以在 SSH 连接之前,将远程服务器的主机密钥添加到 ~/.ssh/known_hosts,从而避免在首次连接时触发警告。

示例:

yaml
- name: Add SSH Key to known_hosts
  run: |
    mkdir -p ~/.ssh
    ssh-keyscan -H ${{ secrets.SSH_HOST }} >> ~/.ssh/known_hosts

解释:

mkdir -p ~/.ssh:确保 .ssh 目录存在。 ssh-keyscan -H ${{ secrets.SSH_HOST }} >> ~/.ssh/known_hosts:使用 ssh-keyscan 获取远程服务器的公钥,并将其添加到 known_hosts 文件中 。-H 参数确保主机名被规范化为标准格式。

方法二:手动添加主机指纹

如果你已经知道远程服务器的 SSH 主机指纹,可以手动将其添加到 known_hosts 文件中。你可以从远程服务器的管理员处获取 SSH 指纹。

示例:

假设远程服务器的 IP 地址是 203.0.113.0,并且你已经知道它的主机指纹是以下内容:

203.0.113.0 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIE9kOeW48jYqshJ+qEfNR1WwFyJxtjOuS9C+is6H1pZ9

你可以将这段指纹信息直接添加到 known_hosts 文件中:

yaml
- name: Add known_hosts manually
  run: |
    mkdir -p ~/.ssh
    echo "203.0.113.0 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIE9kOeW48jYqshJ+qEfNR1WwFyJxtjOuS9C+is6H1pZ9" >> ~/.ssh/known_hosts

方法三:使用 StrictHostKeyChecking no(不推荐)

还有一种方法是通过禁用 SSH 的主机密钥检查(StrictHostKeyChecking no)来避免此类警告,但这种方法不太推荐,因为它降低了安全性,可能导致潜在 的安全风险。

示例:

yaml
- name: Disable host key checking (not recommended)
  run: |
    export SSH_STRICT_HOST_KEY_CHECKING=no
    ssh -o StrictHostKeyChecking=no user@server "your command here"

警告:

这种方式虽然可以消除警告,但会失去 SSH 主机指纹验证的安全保障,因此在生产环境中不建议使用。

完整的 GitHub Actions 工作流示例

以下是一个完整的工作流示例,展示了如何使用 ssh-keyscan 来预先添加远程主机的 SSH 指纹,并避免警告:

yaml
name: push自动更新

on:
  push:
    branches:
      - main

env:
  TZ: Asia/Shanghai

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: 🚀 检查代码
        uses: actions/checkout@v2

      - name: 🐧 配置环境
        uses: actions/setup-node@v2
        with:
          node-version: "20"

      - name: 🛠️ Build
        run: |
          npm install
          npm run docs:build

      - name: Add SSH Key to known_hosts
        run: |
          mkdir -p ~/.ssh
          ssh-keyscan -H ${{ secrets.SSH_HOST }} >> ~/.ssh/known_hosts

      - name: 🛠️ Setup SSH
        uses: webfactory/ssh-agent@v0.5.4
        with:
          ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}

      - name: 🚁 部署到服务器
        uses: wlixcc/SFTP-Deploy-Action@v1.2.4
        with:
          username: ${{ secrets.SSH_USERNAME }}
          port: "22"
          server: ${{ secrets.SSH_HOST }}
          ssh_private_key: ${{ secrets.SSH_PRIVATE_KEY }}
          local_path: ".vitepress/dist/*"
          remote_path: ${{ secrets.WEB_PATH }}
          delete_remote_files: true

关键步骤解释:

  1. Add SSH Key to known_hosts:使用 ssh-keyscan 在首次 SSH 连接之前,将远程服务器的 SSH 指纹添加到 known_hosts,避免后续连接时出现警 告。
  2. Setup SSH:设置并添加私钥到 ssh-agent,确保 SSH 连接的安全认证。
  3. SFTP 部署:通过 SFTP 将构建后的文件上传到远程服务器。

总结

Warning: Permanently added '***' (ECDSA) to the list of known hosts. 不是错误,而是 SSH 首次连接到远程服务器时的正常行为。然而,为了避免此 类警告影响工作流的顺利执行,建议在 GitHub Actions 中通过 ssh-keyscan 预先添加远程主机指纹。这样可以确保安全性,并避免首次连接时的警告信息 。

通过这种方式,你可以确保 GitHub Actions 工作流在自动化部署中顺利运行,同时保持连接的安全性。