新闻详情

新闻详情

首页 / 资讯中心 / 详情

Apache DolphinScheduler SSH 数据源配置指南:为 RemoteShell 远程任务打通免代理执行通道

发布时间:2026/9/15 7:23:45来源:尧图网络
Apache DolphinScheduler SSH 数据源配置指南:为 RemoteShell 远程任务打通免代理执行通道
Apache DolphinScheduler SSH 数据源配置指南为 RemoteShell 远程任务打通免代理执行通道【免费下载链接】dolphinschedulerApache DolphinScheduler is the modern data orchestration platform. Agile to create high performance workflow with low-code项目地址: https://gitcode.com/GitHub_Trending/dol/dolphinschedulerSSH 数据源是 Apache DolphinScheduler 中一类特殊的非关系型数据源专门服务于 RemoteShell远程 Shell任务组件让工作流能够在不部署任何 Agent、不经过 Worker 本地进程的情况下通过标准 SSH/SFTP 协议把脚本推送到远端主机并以nohup方式执行。本文以官方文档 SSH Data Source 为骨架结合仓库中dolphinscheduler-datasource-ssh与dolphinscheduler-task-remoteshell两个插件的真实源码完整讲解 SSH 数据源的字段含义、密码/公钥双认证机制、连接校验原理、插件激活方式以及 RemoteShell 任务消费该数据源的底层调用链读完即可在集群中创建并正确使用 SSH 数据源完成远程命令编排。SSH 数据源是什么为远程命令执行而生与 MySQL、PostgreSQL 等以 JDBC 建连的数据库数据源不同SSH 数据源在 DolphinScheduler 中承担的是远程主机连接凭据的角色。官方文档开宗明义地指出This data source is used for RemoteShell component to execute commands remotely.也就是说创建 SSH 数据源的目的只有一个——供RemoteShell远程 Shell任务使用让任务在执行时通过 SSH 连接一台远端主机把脚本上传并在其上运行。这一设计规避了传统 Shell 任务脚本必须在 Worker 所在节点本地执行的约束使工作流可以直接操作任意可达的服务器如生产环境的应用主机、堡垒机后方的内网机器等从而实现编排平台与执行目标解耦的远程执行能力。从代码结构上看SSH 数据源的能力边界非常清晰SSHDataSourceProcessor不提供 JDBC URL、驱动或java.sql.Connection其getJdbcUrl、getConnection均返回空/nullSSHDataSourceChannel对createPooledDataSourceClient与createAdHocDataSourceClient一律抛出UnsupportedOperationException见 SSHDataSourceProcessor.java、SSHDataSourceChannel.java。因此它不能像关系型数据源那样被 SQL 类任务消费它唯一的职责就是向 RemoteShell 任务提供 SSH 连接参数。创建 SSH 数据源字段逐项说明在 DolphinScheduler Web UI 中依次进入数据源中心 → 创建数据源在类型下拉框中选择SSH即可看到如下表单对应仓库文档 ssh.md 所列字段表单截图见 docs/img/new_ui/dev/datasource/ssh.png字段是否必填说明Data Source是数据源类型下拉框此处选择SSHData Source Name是数据源名称全局唯一标识便于在 RemoteShell 任务中引用Description否数据源描述说明用途或归属IP是目标 SSH 主机 IP 或域名文档中称为 IP HostnamePort是SSH 服务端口默认值为22User Name是登录 SSH 的用户名表单默认值rootPassword否SSH 密码用于密码认证Public Key否私钥内容PEM 格式用于公钥认证与 Password 二选一即可表单底部提供三个操作按钮Cancel取消、Test Connect测试连接、Confirm确认。其中Test Connect会实际发起一次 SSH 认证握手用于在保存前验证凭据是否正确。从后端参数模型可以印证上述字段的落库结构。SSHConnectionParam见 SSHConnectionParam.java定义了user、password、privateKey、host、port默认22五个连接属性SSHDataSourceParamDTO见 SSHDataSourceParamDTO.java在其基础上扩展了privateKey字段类型标识为DbType.SSH。SSHDataSourceProcessor.createConnectionParams负责把表单 DTO 转换为连接参数对象并完整映射用户名、密码、主机、端口与私钥。必填校验与唯一标识在保存数据源时SSHDataSourceProcessor.checkDatasourceParam会执行参数合法性校验源码见 SSHDataSourceProcessor.javaif (StringUtils.isEmpty(datasourceParamDTO.getHost()) || StringUtils.isEmpty(datasourceParamDTO.getUserName())) { throw new IllegalArgumentException(ssh datasource param is not valid); }也就是说IP 与 User Name 是硬性必填项缺失任一字段都会直接抛出IllegalArgumentException。而密码与公钥均允许为空——这对应了密码、公钥至少配置其一即可完成认证的设计下文详解。从源码看仅当两者都缺失时认证才会在连接阶段失败。此外每个 SSH 数据源会通过getDatasourceUniqueId生成形如ssh{host}{user}{加密后的密码}的唯一标识见 SSHDataSourceProcessor.java密码在存储前会经过PasswordUtils.encodePassword加密处理避免凭据以明文形式落库。双认证机制密码与公钥的底层实现SSH 数据源同时支持密码认证与公钥认证两种方式且可叠加配置。其底层基于 Apache MINA SSHD 客户端实现核心逻辑位于 SSHUtils.java 的getSession方法session client.connect(connectionParam.getUser(), connectionParam.getHost(), connectionParam.getPort()) .verify(5000).getSession(); // add password identity String password connectionParam.getPassword(); if (StringUtils.isNotEmpty(password)) { session.addPasswordIdentity(password); } // add private key identity String privateKey connectionParam.getPrivateKey(); if (StringUtils.isNotEmpty(privateKey)) { KeyPairResourceLoader loader SecurityUtils.getKeyPairResourceParser(); CollectionKeyPair keyPairCollection loader.loadKeyPairs(null, null, null, privateKey); for (KeyPair keyPair : keyPairCollection) { session.addPublicKeyIdentity(keyPair); } } session.setSessionHeartbeat(SessionHeartbeatController.HeartbeatType.IGNORE, Duration.ofSeconds(3));关键细节如下连接建立调用client.connect(user, host, port)并以5 秒为超时执行verify随后getSession获取客户端会话密码身份只要password非空就通过addPasswordIdentity注册密码身份公钥身份只要privateKey非空就会调用SecurityUtils.getKeyPairResourceParser()解析 PEM 私钥解析出的每个KeyPair都会通过addPublicKeyIdentity注册为公钥身份解析失败会抛出Failed to add public key identity会话保活设置每3 秒一次的IGNORE类型会话心跳防止长任务执行期间连接被服务端或中间设备空闲断开。同样的逻辑在SshClientWrapper见 SshClientWrapper.java中也有对应实现构造时校验ip、port、userName非空随后按先密码、后公钥的顺序注册认证身份并在isAuth()中以10 秒超时执行clientSession.auth().verify(...)判断认证是否成功。实践建议由于两种身份可以同时注册即使同时填写了密码与公钥只要任一种能被远端主机接受即可完成认证。生产环境建议优先使用公钥认证禁用密码登录并把私钥粘贴在 Public Key 输入框中。连接测试Test Connect的实现原理Web UI 上的Test Connect按钮在服务端对应SSHDataSourceProcessor.checkDataSourceConnectivity见 SSHDataSourceProcessor.javatry ( SshClientWrapper sshClientWrapper new SshClientWrapper( baseConnectionParam.getHost(), baseConnectionParam.getPort(), baseConnectionParam.getUser(), baseConnectionParam.getPassword(), baseConnectionParam.getPrivateKey())) { return sshClientWrapper.isAuth(); } catch (Exception e) { log.error(ssh test connection failed, e); return false; }测试流程可概括为用数据源的 host/port/user/password/privateKey 构造SshClientWrappercreateSession中创建默认SshClient客户端并启动以 10 秒超时发起 TCP 连接获取会话注册密码/公钥身份后isAuth()执行实际认证握手并返回是否成功使用try-with-resources确保ClientSession与SshClient被正确关闭不泄漏连接资源。因此Test Connect并不是简单地测试网络可达性而是完整走一遍 SSH 认证流程能够真实反映能否用当前凭据登录远端主机。激活插件SSH 数据源并非开箱即用官方文档在 Native Supported 一节明确说明SSH 数据源不在默认发行版的原生支持范围内需要按伪集群部署文档中 Download Plugins Dependencies 一节的说明手动激活。原因在于从 3.3.0 版本起DolphinScheduler 的二进制发行包不再内置各类插件依赖需要用户按需下载。激活步骤参考 伪集群部署文档执行官方提供的插件安装脚本下载全部插件依赖bash ./bin/install-plugins.sh 3.3.0若只需要部分插件可编辑conf/plugins_config只保留所需项。该配置文件按--alert-plugins--、--datasource-plugins--、--storage-plugins--、--task-plugins--分段声明插件见仓库 config/plugins_config。其中与 SSH 远程执行相关的两行分别是--datasource-plugins-- dolphinscheduler-datasource-ssh以及--task-plugins-- dolphinscheduler-task-remoteshellinstall-plugins.sh见 script/install-plugins.sh会读取conf/plugins_config对每一行插件 artifactId 执行mvnw dependency:get -DgroupIdorg.apache.dolphinscheduler -DartifactId${line} -Dversion${version} -Dclassifiershade将带shade分类器的插件包下载到plugins/目录脚本支持传入自定义版本号默认dev-SNAPSHOT。排错提示如果未安装插件依赖便启动服务使用 SSH 数据源或 RemoteShell 任务时会报ClassNotFoundException。官方文档特别提醒插件依赖包通常不随二进制包分发遇到该异常应回到对应插件类型的文档检查依赖是否缺失。RemoteShell 任务如何消费 SSH 数据源SSH 数据源的最终落脚点是 RemoteShell 任务。以 RemoteShellTask.java 与 RemoteExecutor.java 的源码为依据任务执行链路如下1. 任务初始化initRemoteShellTask.init解析任务参数为RemoteShellParameters含rawScript原始脚本、type数据源类型、datasource数据源 ID 三个字段见 RemoteShellParameters.java并校验rawScript非空。2. 按数据源 ID 取连接参数initRemoteExecutor任务根据配置的数据源 ID从ResourceParametersHelper中取出数据源参数再通过DataSourceUtils.buildConnectionParams(DbType.valueOf(type), dbSource.getConnectionParams())还原为SSHConnectionParam据此构造RemoteExecutor。这正是 SSH 数据源被 RemoteShell 任务引用的方式——数据源 ID 在任务配置中被关联运行时取出其连接凭据建立 SSH 会话。3. 生成脚本buildCommand任务把rawScript中的\r\n统一替换为\n完成参数占位符替换ParameterUtils.convertParameterPlaceholders若配置了环境变量则前置拼入最后加上#!/bin/bash头与echo DOLPHINSCHEDULER-REMOTE-SHELL-TASK-STATUS-$?状态输出指令写入本地执行目录下的.sh文件。4. 远端执行RemoteExecutor.run通过getTaskPid检查远端是否已有同名任务在跑ps -ef | grep taskId.sh避免重复提交使用SFTPSftpClientFactory.instance().createSftpFileSystem把本地脚本上传到远端/tmp/dolphinscheduler-remote-shell-user/taskId.sh以nohup /bin/bash script script.log 21 方式在远端后台启动任务见COMMAND.RUN_COMMAND以5 秒为周期执行tail -n N taskId.log增量拉取远端日志实时输出到任务日志并解析输出参数结束后读取日志末行的状态标记DOLPHINSCHEDULER-REMOTE-SHELL-TASK-STATUS-exitCode得到退出码并执行清理命令删除远端的.sh与.log临时文件。5. 取消与进程树清理kill任务取消时RemoteExecutor.kill先查询任务 PID再通过pstree -p pid获取整棵进程树并解析出所有子进程 PID最后以kill -9一次性终止。这意味着RemoteShell 任务具备级联杀进程能力可以清理远端脚本派生的所有子进程而非只杀主进程。相应地远端主机需要预装pstree工具macOS 为pstreeFedora/RedHat/CentOS/Ubuntu/Debian 系为psmisc包官方文档在伪集群部署前置检查中有明确说明。常见问题与最佳实践小结SSH 数据源不是 JDBC 数据源它没有连接池、驱动与 SQL 执行能力只能被 RemoteShell 任务消费不要在 SQL、DataX 等任务中尝试使用必填项IP 与 User Name 必须填写否则保存时报ssh datasource param is not validPort 默认22认证方式密码与公钥可单独或同时配置公钥需粘贴 PEM 格式私钥内容建议生产环境优先公钥认证插件激活3.3.0 起二进制包不再内置插件需通过install-plugins.sh结合conf/plugins_config下载dolphinscheduler-datasource-ssh与dolphinscheduler-task-remoteshell远端环境要求目标主机需允许 SSH 登录并具备bash、pstree等基础工具任务脚本与日志存放于/tmp/dolphinscheduler-remote-shell-user/目录验证手段创建数据源时使用Test Connect按钮它会真实执行一次 SSH 认证握手10 秒超时比单纯 ping 更可靠。通过上述配置与原理你可以让 DolphinScheduler 工作流以纯 SSH 方式驱动任意远端主机执行脚本实现一处编排、处处执行的远程命令编排能力。【免费下载链接】dolphinschedulerApache DolphinScheduler is the modern data orchestration platform. Agile to create high performance workflow with low-code项目地址: https://gitcode.com/GitHub_Trending/dol/dolphinscheduler创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Agnes AI:文本、图片、视频模型无限期免费,还送 AI 编程工具? 2026/9/15 8:14:55

Agnes AI:文本、图片、视频模型无限期免费,还送 AI 编程工具?

目录写在前面一、公司背景:Agnes AI 是谁?二、三大免费模型全览2.1 文本模型:Agnes-2.5-Flash(当前主力)2.2 图像模型:Agnes-Image-2.1-Flash2.3 视频模型:Agnes-Video-2.02.4 免费政策明细&…

阅读更多 →
大厂Java面试全链路:从HashMap到微服务核心考点解析 2026/9/15 8:14:55

大厂Java面试全链路:从HashMap到微服务核心考点解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
小白/程序员快速入门大模型:Agent Harness才是关键“赛场规则”! 2026/9/15 8:14:55

小白/程序员快速入门大模型:Agent Harness才是关键“赛场规则”!

Agent Harness并非模型外壳,而是整合模型、工具、环境和评测的闭环框架。它关注模型如何与外界交互、调用工具、应对失败及被评测,区别于普通Agent框架。DeepSeek Harness开源,通过插件组合实现模型、工具、会话等功能,并提供评测…

阅读更多 →
DO-160G机载高低温:工作状态与存储状态千万别搞混 2026/9/15 8:14:55

DO-160G机载高低温:工作状态与存储状态千万别搞混

在低空无人机、eVTOL机载设备的DO-160G测试中,高低温试验是最基础也最容易做错的项目。绝大多数研发工程师都会混淆工作状态高低温试验与存储状态高低温试验,要么只用存储状态测试替代工作状态,要么两类试验参数混用、工况选错,导…

阅读更多 →
前端小白也能掌握大模型开发:TypeScript实战路线图 2026/9/15 8:14:55

前端小白也能掌握大模型开发:TypeScript实战路线图

本文指出前端开发者无需学习Python即可利用TypeScript进行AI应用开发。文章强调Vercel的AI SDK和LangChain.js等工具,使前端开发者能够通过TypeScript调用多种AI模型,实现流式UI渲染和Agent编排。前端开发者具有流式UI渲染、全栈能力、用户交互理解和API…

阅读更多 →
Python自动化情侣纪念日文案生成工具开发实践 2026/9/15 8:11:53

Python自动化情侣纪念日文案生成工具开发实践

1. 项目背景与需求分析情人节、恋爱纪念日这些特殊日子,很多情侣都会面临"文案荒"和"配图选择困难症"。根据我过去五年运营情感类公众号的经验,每逢节日前后,"纪念日文案"相关搜索量会暴涨300%以上。这个现象背…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞