深浅模式
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关键步骤解释:
- Add SSH Key to known_hosts:使用
ssh-keyscan在首次 SSH 连接之前,将远程服务器的 SSH 指纹添加到known_hosts,避免后续连接时出现警 告。 - Setup SSH:设置并添加私钥到
ssh-agent,确保 SSH 连接的安全认证。 - SFTP 部署:通过 SFTP 将构建后的文件上传到远程服务器。
总结
Warning: Permanently added '***' (ECDSA) to the list of known hosts. 不是错误,而是 SSH 首次连接到远程服务器时的正常行为。然而,为了避免此 类警告影响工作流的顺利执行,建议在 GitHub Actions 中通过 ssh-keyscan 预先添加远程主机指纹。这样可以确保安全性,并避免首次连接时的警告信息 。
通过这种方式,你可以确保 GitHub Actions 工作流在自动化部署中顺利运行,同时保持连接的安全性。