appleboy/ssh-action 完全指南:用 GitHub Actions 安全执行远程 SSH 命令

发布时间:2026/10/15 20:41:10
appleboy/ssh-action 完全指南:用 GitHub Actions 安全执行远程 SSH 命令 CI/CD【免费下载链接】ssh-actionGitHub Actions for executing remote ssh commands.项目地址https://gitcode.com/gh_mirrors/ss/ssh-action点击查看免费下载本篇技术指南以开源仓库ssh-action即appleboy/ssh-action为核心系统讲解如何通过 GitHub Actions 在 CI/CD 流水线中安全地执行远程 SSH 命令。你将掌握该 Action 的全部 30 输入参数的含义与默认值、SSH 密钥与指纹验证的完整配置流程、多主机批量执行、代理跳板连接、环境变量传递等实战方案并深入理解其基于 Golang 与 drone-ssh 的底层运行机制可对照 action.yml 与 entrypoint.sh 源码验证。项目概览与运行原理ssh-action是一个专为 GitHub Actions 设计的复合compositeAction核心能力是在 CI 中执行远程 SSH 命令典型场景包括流水线部署服务器、批量重启服务、远程拉取镜像并滚动更新、跨多台机器执行运维脚本等。该项目使用 Golang 编写核心逻辑并构建在drone-ssh一个 Go 实现的 SSH 命令行工具之上。从 action.yml 可以确认其运行方式runs.using: composite以复合 Action 形式运行兼容各主流 runner第一步将$GITHUB_ACTION_PATH写入$GITHUB_PATH使 Action 目录内的二进制可直接被调用第二步执行 entrypoint.sh并把所有inputs以INPUT_*前缀的环境变量注入脚本例如INPUT_HOST、INPUT_KEY、INPUT_SCRIPT等。真正的 SSH 执行逻辑并不在本仓库的 Shell 脚本里而是由 entrypoint.sh 在运行时动态下载对应平台与架构的drone-ssh二进制默认版本1.8.0再委托它完成连接与命令执行。该脚本通过uname -s与uname -m检测运行环境支持 Linux / Darwin / Windows 与 amd64 / arm64并从 release 地址拉取drone-ssh-version-platform-arch二进制后执行。输入参数全解ssh-action的所有配置均通过with:传入。下表完整列出 README 与 action.yml 中定义的全部输入参数、用途与默认值输入参数描述默认值hostSSH 主机地址多个主机用逗号分隔无portSSH 端口号22passphraseSSH 私钥的密码短语保护私钥用无usernameSSH 登录用户名无passwordSSH 密码无protocolSSH 协议版本可选tcp、tcp4、tcp6tcpsync多主机时是否同步执行falseuse_insecure_cipher是否启用更多含不安全的加密算法falsecipher允许的加密算法列表未指定时使用合理默认值无timeout建立 SSH 连接的超时时间30scommand_timeoutSSH 命令执行的超时时间10mkeySSH 私钥内容例如~/.ssh/id_rsa的原始内容无key_pathSSH 私钥文件路径无fingerprint主机公钥的 SHA256 指纹无proxy_hostSSH 代理主机地址无proxy_portSSH 代理端口22proxy_protocol代理协议版本可选tcp、tcp4、tcp6tcpproxy_username代理主机用户名无proxy_password代理主机密码无proxy_passphrase代理私钥的密码短语无proxy_timeout连接代理主机的超时时间30sproxy_key代理主机私钥内容无proxy_key_path代理主机私钥路径无proxy_fingerprint代理主机公钥的 SHA256 指纹无proxy_cipher代理允许的加密算法无proxy_use_insecure_cipher代理是否启用更多含不安全加密算法falsescript要执行的命令可多行无script_path从文件执行命令文件相对仓库根目录的路径无envs传递到远端 shell 脚本的环境变量逗号分隔无envs_format环境变量值传递方式的灵活配置无debug启用调试模式falseallenvs把前缀为GITHUB_和INPUT_的所有环境变量传给脚本falserequest_pty向服务器请求伪终端PTYfalsecapture_stdout捕获命令标准输出并写入stdout输出false小细节README 输入参数表中写作script_file但 action.yml 中实际定义的输入名是script_pathREADME 示例代码script_path: scripts/script.sh也使用script_path。从源码结构看表格中的script_file应为笔误配置时请以script_path为准。除上述输入外该 Action 还声明了一个输出见 action.ymlstdout执行命令的标准输出。需要先设置capture_stdout: true随后可通过${{ steps.step_id.outputs.stdout }}在后续步骤中读取例如将远端命令结果写入 issue 评论或通知。快速上手最小可运行示例以下是最基础的用法——通过密码认证远程执行一条命令。将HOST、USERNAME、PASSWORD、PORT存入仓库 Settings → Secrets and variables → Actions 的 Secrets 中name: remote ssh command on: [push] jobs: build: name: Build runs-on: ubuntu-latest steps: - name: executing remote ssh commands using password uses: appleboy/ssh-actionv1.2.0 with: host: ${{ secrets.HOST }} username: ${{ secrets.USERNAME }} password: ${{ secrets.PASSWORD }} port: ${{ secrets.PORT }} script: whoami运行后Action 日志会输出类似如下的结果CMD whoami END linuxserver.io ✅ Successfully executed commands to all hosts. 日志中CMD与END之间是本次实际执行的命令✅ Successfully executed commands to all hosts.表示全部主机执行成功。如果任一主机失败Action 将以非零状态退出流水线会标记为失败。前置准备配置 SSH 密钥相比密码认证私钥认证更安全、更适合长期自动化。README 强调的最佳实践是在本地机器而非远程机器上生成密钥并使用 GitHub Secrets 中指定的用户名登录。生成 RSA 密钥ssh-keygen -t rsa -b 4096 -C your_emailexample.com生成 ed25519 密钥ssh-keygen -t ed25519 -a 200 -C your_emailexample.com将公钥写入远程主机的授权密钥将新生成的公钥追加到远程用户的authorized_keyscat .ssh/id_rsa.pub | ssh bB cat .ssh/authorized_keyscat .ssh/id_ed25519.pub | ssh bB cat .ssh/authorized_keys复制私钥内容并存入 GitHub Secrets以 macOS / Ubuntu 为例将私钥原文复制到剪贴板# macOS pbcopy ~/.ssh/id_rsa # Ubuntu需先安装 xclip sudo apt-get install xclip xclip ~/.ssh/id_rsaed25519 私钥同理# macOS pbcopy ~/.ssh/id_ed25519 # Ubuntu xclip ~/.ssh/id_ed25519随后把复制到的私钥内容粘贴为 GitHub Secrets例如命名为KEY供 workflow 中key: ${{ secrets.KEY }}引用。务必不要把私钥明文写死在 workflow 文件里。权限与兼容性注意事项根据 README 中读者的补充经验部分 SSH 版本还需要将公钥放入.ssh/authorized_keys2将.ssh目录权限改为700将.ssh/authorized_keys2权限改为640。如果你使用 OpenSSH 并遇到如下报错ssh: handshake failed: ssh: unable to authenticate, attempted methods [none publickey]说明服务端不支持你选择的密钥算法。在 Ubuntu 20.04 及更高版本中需要显式允许ssh-rsa算法请在 OpenSSH 服务端配置文件/etc/ssh/sshd_config或/etc/ssh/sshd_config.d/下的附加文件中添加CASignatureAlgorithms ssh-rsa或者直接改用 OpenSSH 默认接受的ed25519密钥生成命令见上文。实战场景一使用私钥认证执行命令- name: executing remote ssh commands using ssh key uses: appleboy/ssh-actionv1.2.0 with: host: ${{ secrets.HOST }} username: ${{ secrets.USERNAME }} key: ${{ secrets.KEY }} port: ${{ secrets.PORT }} script: whoami如果私钥存放在仓库文件中不推荐但用于本地自托管 runner 调试可行也可以改用key_path指向仓库内的密钥文件路径。实战场景二一次执行多条命令script支持多行块逐行作为 shell 命令在远端执行- name: multiple command uses: appleboy/ssh-actionv1.2.0 with: host: ${{ secrets.HOST }} username: ${{ secrets.USERNAME }} key: ${{ secrets.KEY }} port: ${{ secrets.PORT }} script: | whoami ls -al执行结果类似下图所示每条命令的输出会依序打印在日志中实战场景三从文件执行命令当命令较多或需要统一维护时可以把命令写入仓库中的脚本文件例如scripts/script.sh再通过script_path指定- name: file commands uses: appleboy/ssh-actionv1.2.0 with: host: ${{ secrets.HOST }} username: ${{ secrets.USERNAME }} key: ${{ secrets.KEY }} port: ${{ secrets.PORT }} script_path: scripts/script.sh仓库中的 testdata/test.sh 即是一个极简示例内容为whoami可用于验证从文件执行命令的工作方式。实战场景四多主机批量执行host参数支持逗号分隔的多个主机一条 workflow 即可把相同命令批量下发到所有机器- name: multiple host uses: appleboy/ssh-actionv1.2.0 with: - host: foo.com host: foo.com,bar.com username: ${{ secrets.USERNAME }} key: ${{ secrets.KEY }} port: ${{ secrets.PORT }} script: | whoami ls -al默认情况下所有主机共用同一个port默认22。如果各主机端口不同可以在每个主机名后用冒号指定端口- name: multiple host uses: appleboy/ssh-actionv1.2.0 with: - host: foo.com host: foo.com:1234,bar.com:5678 username: ${{ secrets.USERNAME }} key: ${{ secrets.KEY }} script: | whoami ls -al同步执行与失败语义默认sync: false时多主机之间是异步并发执行的适合主机数量多、彼此无依赖的场景若需要在主机间保持确定性的执行顺序或希望任一主机失败后立即中断可开启同步执行- name: multiple host uses: appleboy/ssh-actionv1.2.0 with: host: foo.com,bar.com sync: true username: ${{ secrets.USERNAME }} key: ${{ secrets.KEY }} port: ${{ secrets.PORT }} script: | whoami ls -al实战场景五向远端脚本传递环境变量有时需要把 CI 上下文如 commit SHA、分支名、构建产物路径注入远端脚本。做法分两步在 job 的env:中定义变量再在with.envs中列出要传递的变量名逗号分隔- name: pass environment uses: appleboy/ssh-actionv1.2.0 env: FOO: BAR BAR: FOO SHA: ${{ github.sha }} with: host: ${{ secrets.HOST }} username: ${{ secrets.USERNAME }} key: ${{ secrets.KEY }} port: ${{ secrets.PORT }} envs: FOO,BAR,SHA script: | echo I am $FOO echo I am $BAR echo sha: $SHA注意env:对象中的每个变量都必须以字符串形式传递传入Integer或其他数据类型可能产生意外结果例如被拼接为额外字符。如需把 CI 的所有GITHUB_*、INPUT_*环境变量整体透传可设置allenvs: true它会将带有GITHUB_和INPUT_前缀的全部环境变量传给远端脚本适用于调试与需要完整上下文的场景。实战场景六通过代理主机跳板机连接当目标服务器处于内网、必须经跳板机访问时可以使用proxy_*系列参数。README 先用~/.ssh/config中的ProxyCommand示意链路Laptop -- Jumphost -- FooServerHost Jumphost HostName Jumphost User ubuntu Port 22 IdentityFile ~/.ssh/keys/jump_host.pem Host FooServer HostName FooServer User ubuntu Port 22 ProxyCommand ssh -q -W %h:%p Jumphost等价地在 GitHub Actions 的 YAML 中直接声明代理参数即可无需依赖本机~/.ssh/config- name: ssh proxy command uses: appleboy/ssh-actionv1.2.0 with: host: ${{ secrets.HOST }} username: ${{ secrets.USERNAME }} key: ${{ secrets.KEY }} port: ${{ secrets.PORT }} proxy_host: ${{ secrets.PROXY_HOST }} proxy_username: ${{ secrets.PROXY_USERNAME }} proxy_key: ${{ secrets.PROXY_KEY }} proxy_port: ${{ secrets.PROXY_PORT }} script: | mkdir abc/def ls -al代理侧同样支持proxy_password、proxy_passphrase、proxy_key_path、proxy_fingerprint、proxy_timeout默认30s、proxy_protocol默认tcp与proxy_use_insecure_cipher等完整认证参数基本能力与主连接一致。实战场景七保护私钥passphrase私钥通常由密码短语passphrase加密即使密钥文件因备份泄露或设备退役而流出攻击者也无法直接使用。若生成密钥时设置了 passphrase则在 Action 中通过passphrase传入- name: ssh key passphrase uses: appleboy/ssh-actionv1.2.0 with: host: ${{ secrets.HOST }} username: ${{ secrets.USERNAME }} key: ${{ secrets.KEY }} port: ${{ secrets.PORT }} passphrase: ${{ secrets.PASSPHRASE }} script: | whoami ls -al实战场景八主机指纹验证防中间人攻击设置主机指纹验证可有效防范 Person-in-the-Middle中间人攻击。先获取目标主机的公钥指纹——现代 OpenSSH 版本默认的密钥类型为rsa自 5.1 起、ecdsa自 6.0 起、ed25519自 6.7 起。执行以下命令获取指纹按需把ed25519替换为服务器实际使用的密钥类型把example.com替换为你的主机ssh example.com ssh-keygen -l -f /etc/ssh/ssh_host_ed25519_key.pub | cut -d -f2把输出的 SHA256 指纹存入 Secrets再通过fingerprint传入- name: ssh key passphrase uses: appleboy/ssh-actionv1.2.0 with: host: ${{ secrets.HOST }} username: ${{ secrets.USERNAME }} key: ${{ secrets.KEY }} port: ${{ secrets.PORT }} fingerprint: ${{ secrets.FINGERPRINT }} script: | whoami ls -al指纹校验不通过时连接将被拒绝这能显著提高自动化流水线的安全性。代理主机同样支持proxy_fingerprint做校验。进阶参数与高级输出除上述常用参数外还有几个适合特定场景的开关debug: true开启调试模式打印更详细的连接与执行日志便于排查认证失败、超时等问题request_pty: true向服务器请求伪终端PTY。部分需要 TTY 才能正确交互的命令如某些交互式安装脚本、sudo提示等需要开启timeout默认30s与command_timeout默认10m分别控制建立连接与单条命令执行的超时上限两者单位均为 Go duration 格式如30s、10m。对长任务如数据库迁移、镜像构建应适当调大command_timeoutcapture_stdout: true将命令标准输出写入 Action 的stdout输出见 action.yml后续步骤可用${{ steps.id.outputs.stdout }}读取。其底层实现位于 entrypoint.sh当该开关为true时脚本用 heredoc 把执行输出写入$GITHUB_OUTPUTstdoutEOF ... EOF以支持多行输出。源码级解读entrypoint.sh 的运行机制理解 entrypoint.sh 有助于排查各类玄学问题其核心流程如下环境准备脚本设置set -o errexit -o nounset -o pipefail并导出GITHUBtruedrone-ssh 以此识别自身运行在 GitHub Actions 环境中平台/架构探测优先使用SSH_CLIENT_OS/SSH_CLIENT_ARCH环境变量可自定义否则通过uname -s、uname -m推断支持 Linux / Darwin / Windows 与 amd64 / arm64遇到未知平台或架构会直接报错退出下载二进制以DRONE_SSH_RELEASE_URL默认指向 drone-ssh 的 release 下载地址和DRONE_SSH_VERSION默认1.8.0拼接出drone-ssh-version-platform-arch的下载 URL用curl -fsSL --retry 5下载到$GITHUB_ACTION_PATH并赋予执行权限执行命令先打印二进制版本号再运行drone-ssh完成 SSH 连接与脚本执行若capture_stdouttrue则通过tee将输出同时写入$GITHUB_OUTPUT。可以看到所有with:参数如INPUT_HOST、INPUT_SCRIPT都由 action.yml 以环境变量形式注入最终由 drone-ssh 解析消费。因此该 Action 的实际 SSH 能力由 drone-ssh 决定本仓库负责的是参数映射、二进制分发与 runner 适配。常见问题排查QA远端报 Command not found如 npm 或其他命令这是 GitHub Actions 类非交互式 shell 的经典问题。在许多 Linux 发行版中/etc/bash.bashrc会包含一段非交互式 shell 直接返回的逻辑# /etc/bash.bashrc # System-wide .bashrc file for interactive bash(1) shells. # To enable the settings / commands in this file for login shells as well, # this file has to be sourced in /etc/profile. # If not running interactively, dont do anything [ -z $PS1 ] return由于ssh-action以非交互式 shell 运行命令.bashrc里配置的 PATH 追加、别名、工具链初始化等都不会生效导致npm等命令找不到。两种解法注释掉/etc/bash.bashrc中提前return的那一行让非交互式 shell 也加载系统级配置在script中使用命令的真实绝对路径例如/usr/local/bin/npm绕过 PATH 依赖。总结与推荐配置模板ssh-action把GitHub Actions → 远端服务器的最后一公里封装成了声明式 YAML核心价值在于单条 workflow 即可完成多主机、多命令、代理跳板、环境变量注入与指纹校验的完整编排且无需在 CI 中维护 SSH 客户端细节。一个兼顾安全与可维护性的推荐模板私钥 指纹 超时控制- name: deploy via ssh uses: appleboy/ssh-actionv1.2.0 with: host: ${{ secrets.HOST }} username: ${{ secrets.USERNAME }} key: ${{ secrets.KEY }} port: ${{ secrets.PORT }} fingerprint: ${{ secrets.FINGERPRINT }} timeout: 30s command_timeout: 10m script: | cd /srv/app git pull docker compose up -d --build更多细节可继续阅读本仓库的 action.yml参数与输出定义、entrypoint.sh运行机制以及 testdata/test.sh文件命令的最小示例项目脚本与文档均以 MIT License 发布可放心参考与二次封装。赞分享CI/CD【免费下载链接】ssh-actionGitHub Actions for executing remote ssh commands.项目地址https://gitcode.com/gh_mirrors/ss/ssh-action点击查看免费下载相关推荐【亲测免费】 GitHub Actions 中的SSH命令执行工具appleboy/ssh-action完全指南GitHub Actions 中的SSH命令执行工具appleboy/ssh action完全指南 项目介绍 appleboy/ssh action 是一个高CI/CDGitHub Actions 实现远程 SSH 命令执行的解决方案GitHub Actions 实现远程 SSH 命令执行的解决方案 1. 项目基础介绍 ssh action 是一个开源项目它基于 GitHub ActionCI/CDGitHub Actions SSH 远程命令执行常见问题解决方案GitHub Actions SSH 远程命令执行常见问题解决方案 基础介绍 本项目是一个开源项目它利用 GitHub Actions 实现了远程执行 SSHCI/CD上一篇Adobe-GenP 3.0完整指南技术原理与实战激活Adobe全家桶下一篇终极免费网盘直链下载助手八大平台一键获取真实下载地址的完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询