Apache DolphinScheduler SSH 数据源RemoteShell 远程执行的核心配置与源码原理【免费下载链接】dolphinschedulerApache DolphinScheduler is the modern data orchestration platform. Agile to create high performance workflow with low-code项目地址: https://gitcode.com/gh_mirrors/do/dolphinschedulerSSH 数据源是 Apache DolphinScheduler 中为数不多的非数据库型数据源它不用于建立 JDBC 连接而是为RemoteShell远程 Shell任务组件提供远程主机鉴权信息让工作流可以在任意可通过 SSH 访问的机器上执行命令。阅读本文后你将掌握 SSH 数据源的完整配置项、参数校验规则、连接测试机制以及从数据源到任务执行的底层调用链从而在实际项目中正确搭建远程命令执行场景。一、SSH 数据源在 DolphinScheduler 中的定位在 官方数据源文档 中明确说明该数据源专用于 RemoteShell 组件以便在远程主机上执行命令。它与其他数据源MySQL、Hive、Spark SQL 等最大的区别在于其他数据源服务于 SQL 类任务最终会产出 JDBC URL 与连接SSH 数据源不产生 JDBC 连接——从源码看SSHDataSourceProcessor 的getJdbcUrl()、getValidationQuery()、getDatasourceDriver()均返回空字符串getConnection()直接返回null它承载的是主机 端口 用户名 密码/公钥这类 SSH 登录凭证由 Apache MINA SSHD 客户端库消费。因此凡是想在 DolphinScheduler 工作流中对非 Worker 所在机器下发命令的场景如运维脚本、跨机部署、远程巡检都可以通过 SSH 数据源 RemoteShell 任务组合实现。二、在管理界面创建 SSH 数据源在 DolphinScheduler Web UI 中进入数据源中心新建数据源选择类型SSH表单如下图所示各配置项说明如下继承自官方文档并补充源码细节配置项说明源码对应字段数据源类型Data Source固定选择SSHDbType.SSH数据源名称Data Source Name自定义名称用于任务中引用该数据源BaseDataSourceParamDTO.name描述Description对该数据源的补充说明可选BaseDataSourceParamDTO.noteIP 主机名IP Hostname远程 SSH 服务器地址支持 IP 或域名BaseDataSourceParamDTO.host端口PortSSH 服务端口默认值为 22可在创建时修改SSHConnectionParam.port用户名Username用于登录远程主机的用户名BaseDataSourceParamDTO.userName密码Password密码认证方式的登录密码BaseDataSourceParamDTO.password公钥Public Key密钥认证方式使用的公钥内容SSHDataSourceParamDTO.publicKey其中publicKey字段是 SSH 数据源特有的扩展字段SSHDataSourceParamDTO在继承BaseDataSourceParamDTOdolphinscheduler-datasource-api的基础上仅新增了这一个属性。认证方式的选择从连接参数模型 SSHConnectionParam 可以看到最终落库的凭证包含user、password、publicKey、host、port五个字段支持两种认证方式密码认证只填用户名和密码连接时通过session.addPasswordIdentity(password)注入密码身份公钥认证填写用户名与公钥内容连接时由KeyPairResourceLoader解析公钥并调用session.addPublicKeyIdentity(keyPair)注入密钥身份。两种方式可以同时配置代码会按先后顺序分别注入密码身份与公钥身份见 SSHUtils.getSession()。三、参数校验哪些字段是必填的在 SSHDataSourceProcessor.checkDatasourceParam() 中定义了严格的校验逻辑if (StringUtils.isEmpty(datasourceParamDTO.getHost()) || StringUtils.isEmpty(datasourceParamDTO.getUserName())) { throw new IllegalArgumentException(ssh datasource param is not valid); }即IP 主机名host与用户名userName为必填项任一为空都会抛出IllegalArgumentException并导致创建失败。端口、密码、公钥则为可选端口不填时使用默认值 22密码与公钥可以按认证方式二选一或同时提供。这一点在单元测试 SSHDataSourceProcessorTest.testCheckDatasourceParam() 中得到了验证空 DTO 抛异常、只填 host 仍抛异常、补齐 userName 后才通过校验。四、连接测试数据源测试连接按钮背后的原理创建或编辑 SSH 数据源时点击测试连接按钮后端实际执行的是SSHDataSourceProcessor.checkDataSourceConnectivity()try (SshClientWrapper sshClientWrapper new SshClientWrapper( baseConnectionParam.getHost(), baseConnectionParam.getPort(), baseConnectionParam.getUser(), baseConnectionParam.getPassword(), baseConnectionParam.getPublicKey())) { return sshClientWrapper.isAuth(); } catch (Exception e) { log.error(ssh test connection failed, e); return false; }其底层实现位于 SshClientWrapper使用SshClient.setUpDefaultClient()创建 Apache MINA SSHD 客户端并start()connect(userName, ip, port)建立会话连接超时 10 秒分别注入密码身份与公钥身份公钥通过SecurityUtils.getKeyPairResourceParser()解析isAuth()调用clientSession.auth().verify(Duration.ofSeconds(10)).isSuccess()完成实际认证认证超时同样为 10 秒认证成功返回true否则返回false。测试用例testTestConnection()展示了连接失败返回false以及 mock 认证成功后返回true的两条路径与该实现一致。五、数据源唯一标识DolphinScheduler 为每个数据源生成唯一 ID 用于缓存与去重SSH 数据源的生成规则位于getDatasourceUniqueId()return MessageFormat.format({0}{1}{2}{3}, dbType.getName(), baseConnectionParam.getHost(), baseConnectionParam.getUser(), PasswordUtils.encodePassword(baseConnectionParam.getPassword()));即格式为ssh主机用户名加密密码密码在拼接前会经过PasswordUtils.encodePassword()处理。测试用例testGetDatasourceUniqueId()验证了sshlocalhostroot123456这一输出形式。六、RemoteShell 任务如何消费 SSH 数据源SSH 数据源的直接消费者是 RemoteShell 任务。在 RemoteExecutor 中可以看到完整的调用链任务运行时从数据源取出SSHConnectionParam构造RemoteExecutorgetSession()复用 SSHUtils.getSession() 建立并认证ClientSession通过ChannelExec在远程主机上执行 Shell 命令并借助 SFTPSftpFileSystem完成脚本文件传输远程脚本工作目录固定为/tmp/dolphinscheduler-remote-shell-%s/按任务实例格式化任务状态通过DOLPHINSCHEDULER-REMOTE-SHELL-TASK-STATUS-标记回传执行状态轮询间隔为 5000ms。此外SSHUtils.getSession()中还设置了会话心跳session.setSessionHeartbeat(HeartbeatType.IGNORE, Duration.ofSeconds(3))每 3 秒发送一次心跳以防止空闲会话被服务端断开这对长时间运行的远程命令尤为重要。因此整个链路可以概括为SSH 数据源凭证模型SSHConnectionParam→ RemoteShell 任务RemoteExecutor→ Apache MINA SSHDSshClient/ClientSession→ 远程主机 Shell。七、实践建议与注意事项优先使用密钥认证相比密码公钥认证更安全且便于在目标主机统一维护。公钥内容直接粘贴到公钥Public Key字段即可支持标准 OpenSSH 公钥格式如测试用例中的ssh-rsa AAAAB...。注意端口一致性SSH 数据源默认端口为 22若远程主机使用非标准端口如 2222务必在创建时显式填写否则连接测试会失败。连接超时阈值连接与认证的超时时间在源码中为 510 秒级别SSHUtils连接 verify 为 5000msSshClientWrapper连接与认证为 10 秒。对网络抖动较明显的环境应确保目标主机可达、防火墙放行对应端口。复用连接与心跳保活RemoteShell 任务会复用会话且设置了 3 秒心跳长时间任务无需担心空闲断连但大量并发远程任务会占用较多 SSH 连接资源需结合集群规模合理规划。主机名解析checkDatasourceParam仅做非空校验不校验主机是否真实可达请确保 Worker执行 RemoteShell 任务的节点能解析并访问该主机地址。八、进一步阅读数据源官方文档docs/docs/en/guide/datasource/ssh.mdSSH 数据源插件源码dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-sshSSH 数据源单元测试SSHDataSourceProcessorTest.javaRemoteShell 任务实现RemoteExecutor.java【免费下载链接】dolphinschedulerApache DolphinScheduler is the modern data orchestration platform. Agile to create high performance workflow with low-code项目地址: https://gitcode.com/gh_mirrors/do/dolphinscheduler创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
