Releases: melvek/TaskSSH
Releases · melvek/TaskSSH
Release list
TaskSSH 2.3.0
[2.3.0] - 2026-09-27
Add
command:新增了-L/--local参数,可以在本地环境下执行传入的命令- 依然需要指定
hosts参数 - windows 默认使用
cmd执行,其它环境使用sh执行 - 命名中的转义需要自行处理
- 依然需要指定
- 按组分批执行:
- 任务级
serial:每组内每批 N 台 - 任务级
min_available:每组至少留 N 台在跑 - CLI
-S/--serial:覆盖任务级 serial - CLI
--min-available:覆盖任务级 min_available - CLI
--stop-on-failure:一批失败后停止后续批次(默认 true)
- 任务级
- 调度模型:组间串行、批间串行、批内并发,批不跨组
- dry-run 时打印完整执行队列(组 + 批 + 主机)
Changed
- 优化了控制台消息的输出
dry run:执行 Dry-Run模式时,不再连接远程服务器ResolveHosts不再按host:port去重。同一台物理机上部署
多个服务(属于不同组)时,会分别执行。请用Target hosts
列表和确认步骤校对目标主机。
TaskSSH 2.2.0
[2.2.0] - 2026-09-26
Add
- step
ignore_errors:step 失败时输出警告,但不中断后续步骤- 仅作用于 step 执行失败
- 连接失败仍视为主机级失败,不受影响
- 默认 false
- step
when:条件执行- 支持运算符:
==!=>>=<<=in - 支持逻辑组合:
&&|| - 支持变量替换
{{var}} in支持(a,b,c)和a,b,c两种写法&&优先级高于||- 数字优先按 float64 比较,否则按字符串
- 支持运算符:
- 主机模式展开:命令中的
hosts位置参数支持模式语法,清单配置中不支持配置展开模板- 数字范围:
web[1-10] - 前导零:
web[01-03] - 枚举:
web[a,b,c] - 混合:
web[1-3,5,7-9] - 字符范围:
node[a-c] - 多段组合:
web[1-2].dc[beijing,wuhan].com - IP 范围:
10.0.0.[1-10] - 组名前缀:
prod/web[1-3]
- 数字范围:
- 展开后按
host:port去重,避免重复执行
TaskSSH 2.1.0
[2.1.0] - 2026-09-25
Breaking Changes
- vault 密钥外置:加密密钥不再硬编码在二进制中
- 默认交互输入
- 支持
--secret-key-file指定密钥文件(普通文本或可执行脚本),默认位置~/.taskssh/vault-key - 旧密文无法解密,需用
taskssh encrypt重新加密 - 移除
push -B/--backup:不再支持覆盖前自动备份 - 需要备份时,在任务里增加
command步骤执行备份命令 - 移除
fetch -F/--force和fetch -B/--backup:fetch默认覆盖本地已存在文件
- 强制密码加密:清单文件中的
password必须是taskssh encrypt生成的密文
Add
- script 任务:新增
scriptaction,将本地 shell 脚本上传到远程主机并执行- CLI:
taskssh script <host> -f <file> [-d <dest>] [-R] [-F] - 清单:
action: script,参数file/dest/remove/force - 默认上传到
/tmp,执行后可选删除,覆盖已存在文件可选
- CLI:
- push 目录上传:
push支持目录- 不传
-z:递归逐文件上传,不依赖远程工具 - 传
-z:本地 zip 打包上传,远程unzip解包,依赖远程unzip
- 不传
- fetch 目录下载:
fetch支持目录- 不传
-z:递归逐文件下载,不依赖远程工具 - 传
-z:远程zip -r打包,下载后本地archive/zip解压,依赖远程zip - 新增
-T/--tmp-dir:指定远程临时目录,默认/tmp,仅-z时生效
- 不传
- 连接复用:每台主机连接一次,执行完整条任务后关闭,连接次数从「主机数 × step 数」降为「主机数」
--connect-timeout:新增连接超时配置,单位秒,默认10--secret-key-file/-V:指定密钥文件或可执行脚本- 普通文本:内容即密钥
- 可执行文件:执行输出作为密钥
- 支持
~展开
--dry-run:新增 dry-run 模式,连接远程但不执行命令和文件操作- 输出每台主机每个 step 的解析后参数
- 跳过执行前确认,不输出执行摘要
- CLI 变量注入:新增
-D/--define参数- 格式:
-D key=value,可重复 - 优先级最高,覆盖
global_vars/ 组vars/ 主机Extra - key 和 value 均做 trim
- 拒绝覆盖保留变量(
date/execId) - 用法示例:
taskssh revert web_server -D revert_id=20260925_0K8X7A2B
- 格式:
- 主机查找增强:支持按组名、
组名/主机名、组内主机名查找- 组名精确匹配:展开组内所有主机
组名/主机名格式:精确到单台主机,如web_server/web_1- 组内主机名唯一匹配:如
web_1,自动定位到所属组 - 多组同名主机时报错,并提示使用
组名/主机名格式 - 独立主机名或 IP 仍按原逻辑处理
Changed
- 输出:单 step 任务不再输出
[STEP 1/1]行 push:-f的说明从「文件」改为「文件或目录」encrypt:交互输入密钥两次(输入 + 确认)decrypt:交互输入密钥一次fetch:默认覆盖本地文件,不再需要-Fscript -R/--remove:短选项从-R改为-r
Performance
- SFTP 会话复用:每个
Client持有复用的 SFTP 会话,避免每次文件操作都创建新 channel- 影响
push/fetch目录场景,一次任务期间的 SFTP channel 创建次数从数百次降为 1 次 - 跨机房网络下收益更明显
- 影响
Fix
- 修复变量加载顺序错误,导致全局参数意外覆盖了服务器参数的错误
- 修复FetchAvtion本地路径解析异常导致下载失败的问题
TaskSSH 2.0.1
[2.0.1] - 2026-09-23
Add
- 并发执行:新增
-c/--concurrency并发执行参数,默认值 1 表示串行执行,同时优化了并行时的日志输出
Changed
- 信息输出:现在服务器返回的信息可以实时输出了
Fix
- 修复变量加载顺序错误,导致全局参数意外覆盖了服务器参数的错误
- 修复FetchAvtion本地路径解析异常导致下载失败的问题
TaskSSH 2.0.0
[2.0.0] - 2026-09-22
重大版本更新:Java → Go 重写。
本项目从 Java + JSch 完全重写为 Go,目标是单文件分发、跨平台编译、更好的性能和可维护性。
Java 版已迁移至taskssh-java-final分支,除重大 BUG 外不再更新。
主分支现为 Go 版,将持续演进。
⚠️ Breaking Changes
- 运行环境变更:不再需要 JDK,改为单文件二进制
- 密文格式不兼容:加密算法从 Jasypt(PBEWithMD5AndDES)改为 AES-256-GCM
- Java 版生成的密文无法在 Go 版解密
- 迁移时需用 Go 版重新加密密码:
taskssh encrypt "密码"
- 配置文件兼容:
inventory.yaml结构完全不变,用户无需修改清单
Add
- 单文件分发:编译产出单个二进制,无需任何运行时
- Windows:
taskssh.exe - Linux:
taskssh - macOS:
taskssh
- Windows:
Changed
- 异常处理:从 Java 异常体系改为 Go 的
error返回值 - 日志输出:格式对齐 Java 版
- 上传下载输出:输出完整路径(本地绝对路径 + 远程完整路径)
- 包结构:按 Go 惯例重新组织
Removed
- 移除 Java 版全部代码(迁移至
taskssh-java-final分支)
Performance
| 维度 | Java 版 | Go 版 |
|---|---|---|
| 启动时间 | ~500ms | ~10ms |
| 内存占用 | ~50MB | ~5MB |
| 二进制大小 | JAR + JDK (~200MB) | 单文件 (~6MB) |
| 部署 | 需装 JDK | 拷贝即用 |
Migration Guide
从 Java 版迁移到 Go 版:
- 下载 Go 版:下载对应平台的
taskssh/taskssh.exe - 保留清单文件:
inventory.yaml结构不变,可直接使用 - 重新加密密码:
taskssh encrypt "你的密码",把新密文填回清单 - 验证:
taskssh command prod -e "date" -y
TaskSSH 1.3.1
更新日志
[1.3.1] - 2026-09-22
这是 Java 版 TaskSSH 的最后一个稳定版本。
Java 版将迁移至独立分支
java-legacy,除重大 BUG 外不再更新。
主分支将作为 Go 版本继续演进,目标是单文件分发、跨平台编译、更好的并发能力。
Go 版将继承全部功能,现有inventory.yaml清单结构完全兼容;密码密文格式不兼容,迁移时需用 Go 版重新加密。
Fixed
- 跨组主机名重复导致静默覆盖:不同服务器组中存在同名主机时,后解析的组会覆盖先解析的组,导致部分主机被遗漏
- 现在主机标识改为
组名/主机名(如prod/web_1),支持跨组同名 - 独立主机(不在任何组内)仍使用原始主机名作为标识
- 现在主机标识改为
Changed
- 主机展示格式:目标主机列表和日志中的主机名,从
web_1变为prod/web_1,语义更明确
TaskSSH 1.3.0
[1.3.0] - 2026-09-21
Add
- 批量下载:新增
fetch任务,从远程主机下载文件到本地-f, --file远程文件路径-d, --dest本地目标路径-F, --force覆盖本地已存在文件-B, --backup覆盖前备份本地原文件dest以/结尾时,按主机标识分组存放:dest/<主机标识>/<文件名>- 本地目录不存在时自动创建
- 不支持远程目录,需先在远程打包
- SSH 会话工厂:抽取
SshSessionFactory,统一连接、认证、超时 - 私钥认证:支持
identity_file配置,~自动展开 - 私钥口令:支持
passphrase配置,与密码同样加密存储
Changed
- SSH 工具类签名:
JschCommandExecutor/JschFileUploader改为接收HostVars SshUserInfo增强:支持 passphrase 与终端交互输入- 输出日志: 优化了输出内容可读性
Fixed
- 修复跨组主机名重复导致的静默覆盖问题,主机标识改为
组名/主机名
TaskSSH 1.2.1
[1.2.1] - 2026-09-20
Add
- 加解密工具独立入口:新增 taskssh encrypt / taskssh decrypt 子命令,无需依赖清单文件即可单独使用
- SSH登录:支持终端交互输入密码
Changed
push不再自动解压:上传压缩包后不执行解压,如需解压请在任务中显式添加command步骤,执行远程解压命令
Fixed
- 修复
JschCommandExecutor中输出重定向可能会导致输出信息异常的错误
TaskSSH 1.2.0
[1.2.0] - 2026-09-19
Breaking Changes
push默认行为变更:远程文件已存在时不再自动备份覆盖,改为报错。需显式使用-F才覆盖,-F -B备份后覆盖- 变量严格模式:未解析的
${var}会直接报错,不再静默保留
Add
- 覆盖策略:
push新增-F/-B参数,控制覆盖和备份行为 - 步骤等待:
Step新增delay字段,执行后按配置等待再进入下一步 - CLI 值支持变量:CLI 参数值可引用
${var},每台主机按各自变量展开
Changed
- 变量优先级调整:CLI 参数 >
step.with> 变量池(global_vars/ group / host) step.with定位调整:只作参数容器,不再参与变量池- CLI 结构优化:参数解析不再受
-i位置限制,taskssh -h可正常输出帮助
Fixed
- 修复
-e无法覆盖内置任务中${command}的问题 - 修复变量未解析时静默保留的问题
- 修复
taskssh -h被误判为任务名的问题 - 修复大输出场景下远程命令退出码可能取错的问题
- 修复备份文件命名可能重复的问题
TaskSSH 1.1.1
[1.1.1] - 2026-09-17
Add
- 新增了编码规范,后续将逐步对存量代码规范进行补充修正
- 编码遵循
Alibaba Java Coding Guidelines规范,详见 CONTRIBUTING.md
- 编码遵循
- 覆盖策略:
push动作新增-F/--force与-B/--backup参数- 默认:远程文件已存在则报错,避免误覆盖
-F:直接覆盖-F -B:备份原文件(追加时间戳)后覆盖
- 步骤等待时间:
Step新增delay字段,单位为秒,默认0表示不等待。执行成功后按配置等待再进入下一步
Changed
push默认行为变更:由"自动备份 + 覆盖"改为"已存在则报错",需显式使用-F才覆盖- 变量优先级调整:CLI 参数(
-e/-f/-d等)优先级最高,覆盖global_vars、servers.vars、hosts.extraFields与steps[].with JSchFileUploader.uploadFile签名调整:新增OverwritePolicy参数,返回值统一为int- 异常统一:所有执行异常包装为
JsshException,携带主机名与步骤名 JSchCommandExecutor.executeCommand签名调整:输出直接打印,返回int退出码
Fixed
- 修复
-e参数无法覆盖内置任务中${command}的问题 - 修复变量替换未命中时静默保留
${xxx}导致的隐性错误 - 修复上传过程中目标已存在时的备份文件命名可能重复的问题