JSCH是Java Secure Channel的缩写,是一个SSH2的纯Java实现,允许用户连接到SSH服务器上并进行X11转发、SFTP文件传输、基于端口转发等等操作。
本篇博文将从分布式文件管理介绍、分布式进程管理介绍、鉴权设计及远程连接建立流程,这三个方面介绍如何基于JSCH实现分布式进程管理&分布式文件管理。
【作者】公远/陈震(gongyuan.cz$taobao.com/ 100continue$sina.com)
【源码下载】
github地址:https://github.com/100Continue/Gulu--web-server-test-tools
【扩展阅读】
【功能介绍】
1. 分布式文件管理介绍
a) 需求:
i. 设计要求:
1. 支持不同操作系统之间的文件管理;
2. 支持文件上传下载的进度展现;
3. 接口设计简洁且易扩展维护,代码应用快捷方便;
ii. 功能要求:
1. 支持两台远程服务器之间的文件/文件夹互相拷贝及重命名保存
2. 支持从远程服务器上下载文件/文件夹到本地服务器的指定地址
3. 支持将本地服务器的文件/文件夹上传到远程服务器的指定地址
4. 支持删除远程服务器上的文件/文件夹
5. 支持获取远程文件内符合特定关键字或正则匹配的文本数据
6. 支持验证文件路径是否是目录
7. 支持验证文件路径的文件/文件夹是否存在
8. 支持将文件路径内的所有文件名输出成list对象
9. 支持在远程服务器上创建目录
10. 支持在远程服务器上对文件/文件夹进行重命名
11. 支持在远程服务器上设置文件/文件夹的文件属性及权限
12. 支持在远程服务器上设置文件/文件夹的用户组及归属用户
b) 具体实现:
结合上述需求及保障可扩展性,可维护性的要求。分布式文件管理设计参见下幅UML图:
FileHandler作为分布式文件管理的接口类,不仅具备接口设计简洁,代码应用快捷的特点,而且具备可扩展可维护性,方便后续扩展其他实现方式(如STAF、手动设置信任关系等);
FileHandlerSFTPImpl就是采用JSCH的SFTP方式对FileHandler接口进行实现。其中为了实现不同操作系统之间的文件/文件夹互相拷贝操作,将命令发起机器定义为中转站。如拷贝A机器的文件/文件夹到B机器上,则默认先将A机器的文件/文件夹下载到命令发起机器(中转站)的临时文件/文件夹内,再从命令发起机器(中转站)将临时文件/文件夹的A机器数据上传到B机器的相应位置;
FileProgressMonitor主要用于展现文件上传下载的进度展现,方便用户了解当前操作的进度;
SFTPChannelProvider主要用于鉴权、通讯建立、SFTP通道建立,该实现细节将在第三部分鉴权设计及远程连接建立流程中做介绍;
c) 代码应用:
// 采用提供用户名及加密密码的方式进行鉴权(第三部分介绍其他几种鉴权方式) PasswordAuthorization passwords = new PasswordAuthorization( “username”, "ab6sA7Eo7InqWEnnnFFqw788FvvOCZ7H"); // FileHandler 对象 FileHandlerSFTPImpl fileHandler = new FileHandlerSFTPImpl( passwords); // 两台服务器之间文件拷贝及重命名 OperationResult result = fileHandler.copyFile(“xx.xxx.x.29”, "/home/admin/log.log", “xx.xxx.x.31”, "/home/admin/copyfile_log"); // 两台服务器之间文件夹拷贝及重命名 OperationResult result = fileHandler.copyDirectory(“xx.xxx.x.29”, "/home/admin/sql/", “xx.xxx.x.31”, "/home/admin/copyfolder"); // List对象保存文件夹内文件列表 List list = fileHandler.listDirectory(“xx.xxx.x.29”, "/home/admin/sql/"); // 文件夹重命名 fileHandler.rename(“xx.xxx.x.29”, "/home/admin/copyfolder", "/home/admin/ttttdd/"); // 修改文件夹使用权限 fileHandler.setMode(“xx.xxx.x.29”, "/home/admin/xx.jpg", 7777, true); // 修改文件夹所有者 fileHandler.setOwner(“xx.xxx.x.29”, "/home/admin/ttttdd", 0, true);
2. 分布式进程管理介绍
a) 需求:
i. 设计要求:
1. 支持对所有能够建立SSH连接的机器进行远程进程管理;
2. 接口设计简洁且易扩展维护,代码应用快捷方便
ii. 功能要求:
1. 支持远程命令执行及指定用户的远程命令执行(如root权限、指定user的用户权限);
2. 支持通过进程名获取远程机器的进程ID列表;
3. 支持通过进程名或进程ID来KILL进程;
b) 具体实现:
结合上述需求及保障可扩展性,可维护性的要求。分布式进程管理设计参见下幅UML图:
ProcessHandler作为分布式进程管理的接口类,不仅具备接口设计简洁,代码应用快捷的特点,而且具备可扩展可维护性,方便后续扩展其他实现方式(如STAF、手动设置信任关系等);
ProcessHandlerExecImpl就是采用JSCH的EXEC通道连接方式对ProcessHandler接口进行实现。支持本地机器及远程机器的进程管理;
ExecChannelProvider主要用于鉴权、通讯建立、EXEC通道建立,该实现细节将在第三部分鉴权设计及远程连接建立流程中做介绍;
c) 代码应用:
// 采用提供用户名及加密密码的方式进行鉴权(第三部分介绍其他几种鉴权方式) PasswordAuthorization passwords = new PasswordAuthorization( “username”, "ab6sA7Eo7InqWEnnnFFqw788FvvOCZ7H"); // processhandler 对象 ProcessHandlerExecImpl processhandler = new ProcessHandlerExecImpl( passwords); // 所提供用户名的用户权限下的命令执行 OperationResult result = processhandler.executeCmd(“xx.xxx.x.29”, "./sleep.sh ", true); // root权限下的命令执行 OperationResult result = processhandler.executeCmdByRoot(“xx.xxx.x.29”, "ls", false); // 指定用户权限的命令执行 OperationResult result = processhandler.executeCmdByUser("admin", “xx.xxx.x.29”, "ls", false); // 通过进程名及进程所属用户信息获取该进程ID列表 int[] id = processhandler.getPidByProcName(“username”, “xx.xxx.x.29”, "./sleep.sh"); // 通过进程ID或进程名杀进程 OperationResult result = processhandler.killProcess(“xx.xxx.x.29”, "sleep.sh"); OperationResult result = processhandler.killProcess(“xx.xxx.x.29”, 10294); OperationResult result = processhandler.killProcessNow(“xx.xxx.x.29”, "sleep.sh"); OperationResult result = processhandler.killProcessNow (“xx.xxx.x.29”, 10294);
3. 鉴权设计及远程连接建立流程
a) 需求:
i. 支持3种认证机制:
1. 基于用户名密码的认证机制;
2. 基于DSA/RSA的认证机制;
3. 交互输入用户名密码的认证机制;
ii. 鉴权及连接建立过程对用户透明,保障代码编写便捷;
iii. 接口设计易于扩展与维护,方便后续实现其他认证机制;
b) 具体实现
结合上述需求及保障可扩展性,可维护性的要求。分布式进程管理设计参见下幅UML图:
AuthorizationInterface作为鉴权的接口支持1. 基于用户名密码的认证机制;2. 基于DSA/RSA的认证机制;3. 交互输入用户名密码的认证机制;同时由于接口的易扩展性,后续可在该接口上扩展其他鉴权机制;
PasswordAuthorization和KeyAuthorization分别对应基于用户名密码的认证机制和基于DSA/RSA认证机制的接口实现;用于存储不同认证机制所需要的鉴权数据;
SessionProvider根据所传入的鉴权数据对象,区分用户采用哪种鉴权认证机制,并根据相应的鉴权认证机制进行数据校验和生成对应的Session对象与远程机器连接鉴权。如果鉴权机制为用户名密码的认证机制,则设置UserInfo对象为DefaultUserInfo类型;如果鉴权机制为交互输入用户密码的认证机制,则设置UserInfo对象为KeyboardInteractiveUserInfo,该对象将提供与用户交互的输入窗口;
最后将生成的Session对象传递给ExecChannelProvider用于生成应用于分布式进程管理的EXEC通道,通过该通道可以进行分布式进程管理操作;或者将生成的Session对象传递给SFTPChannelProvider用于生成应用于分布式文件管理的SFTP通道,通过该通道可以进行分布式文件管理操作。
注:目前JSCH只支持OpenSSH和SSH 1生成的private/public key所以当你们发现不能通过private/public key认证的时候,不是JSCH的问题,而是不能识别的问题;
c) 代码应用
// 基于用户名密码的认证机制生成进程管理和文件管理对象 PasswordAuthorization passwords = new PasswordAuthorization( “username”, "ab6sA7Eo7InqWEnnnFFqw788FvvOCZ7H"); ProcessHandlerExecImpl processHandler = new ProcessHandlerExecImpl( passwords); FileHandlerSFTPImpl fileHandler = new FileHandlerSFTPImpl( passwords); // 基于DSA/RSA的认证机制生成进程管理和文件管理对象 KeyAuthorization keyAuth = new KeyAuthorization ( “username”, "id_dsa_filepath"); ProcessHandlerExecImpl processHandler = new ProcessHandlerExecImpl( keyAuth); FileHandlerSFTPImpl fileHandler = new FileHandlerSFTPImpl( keyAuth); // 交互输入用户名密码的认证机制生成进程管理和文件管理对象 PasswordAuthorization passwords = new PasswordAuthorization( “username”, ""); //不传入密码,将采用交互输入方式进行认证 ProcessHandlerExecImpl processHandler = new ProcessHandlerExecImpl( passwords); FileHandlerSFTPImpl fileHandler = new FileHandlerSFTPImpl( passwords); // 对本地进程进行管理的设置方式 PasswordAuthorization passwords = new PasswordAuthorization( "", ""); //不传入用户名密码,将允许对本地进行进行管理 ProcessHandlerExecImpl processHandler = new ProcessHandlerExecImpl( passwords); OperationResult result = processHandler.executeCmd("", "ipconfig /all", false);
备注说明:用户明文密码如何加密
使用Gulu工程内的工具类Util来进行加密处理。
代码示例:
String 加密后密码 = Util. getEncryptedPasswords(明文密码);
PasswordAuthorization passwords = new PasswordAuthorization(
"username",加密后密码);
OK,web服务器测试工具Gulu——基于JSCH实现分布式进程管理&分布式文件管理工具 介绍完毕,抱歉拖了这么久才完成文档撰写。
转发请备注转自:100continue.iteye.com
相关推荐
在Web服务器测试工具Gulu中,分布式文件管理是其核心特性之一,主要依赖于JSCH库来实现在多台远程服务器之间的文件和文件夹操作。JSCH是一个Java实现的SSH2库,提供了包括SFTP(Secure File Transfer Protocol)在内...
Web服务器测试工具Gulu是一款全面的测试解决方案,专为测试和管理Web服务器、分布式系统以及性能测试而设计。这款工具由公远和陈震共同开发,并在GitHub上开源。以下是Gulu的主要功能及其详细介绍: 1. **HTTP接口...
在本文中,我们将深入探讨一款名为Gulu的Web服务器测试工具,它专注于HTTP接口测试。Gulu工具的主要目的是为了方便地模拟各种RESTful请求,并全面地处理和验证服务器的响应。接下来,我们将从请求设置、响应保存和...
在"Go开发-工具类"的标签下,我们可以期待这个库包含了各种与开发流程相关的辅助工具,例如代码质量检查、依赖管理、测试工具、日志处理、网络通信等。 在文件列表中,我们看到有一个名为`gulu-master`的压缩包,这...
- **基本介绍**:PureLoad是一款基于Java的性能测试工具。 - **优点**: - 使用XML编写测试脚本,易于编写和维护。 - 测试结果可以输出为HTML文件,便于查看。 - **适用场景**:适用于Java应用的性能测试。 #### ...
gulu-ui-web通过其直观的组件和易于理解的API,为开发者提供了构建高效、美观的预览页面的工具。 HTML(HyperText Markup Language)是构成网页的基础语言,用于定义网页内容的结构和样式。在这个项目中,HTML被...
同时也欢迎关注 B3log 开源社区微信公众号 B3log开源::sparkles: 功能文件操作 gulu.File获取文件大小判断路径是否存在判断文件是否是图片按内容判断文件是否是可执行二进制判断文件是否是目录复制文件复制目录Go ...
综上所述,"gulu-ui-1" 是一个基于Vue.js的前端UI库,它提供了一系列的组件和工具,旨在简化Web应用的开发过程,提高开发效率,同时保持良好的用户体验和性能。开发者可以利用它的组件、响应式设计和定制能力,快速...
安装 使用yarn安装 ...import ' fanlelee/dist/gulu.css ' export default { name : ' App ' , components : {GButton} } </ script > Fanlelee用户界面 包含了基本轮子按钮,Toast,Icon,Input ...,
在实际开发中,"**gulu-ui**"的使用还需要配合Webpack或Vue CLI等工具进行打包,以处理Vue单文件组件(.vue文件)和其他静态资源。同时,了解Vue Router和Vuex等生态系统工具也是必要的,它们分别负责前端路由管理和...
在“gulu.slx”文件中,包含了这样一个完整的电压闪变仿真模型。用户可以打开此文件,查看和学习模型的结构,以及各模块的具体设置。通过研究和修改这个模型,不仅可以加深对电压闪变现象的理解,还能掌握Simulink在...
在提供的压缩包文件"GuLu-demo-main"中,可能包含了项目源码、示例代码、样式文件、配置文件以及可能的README文档,这些都会详细介绍如何使用各个组件以及定制样式的方法。通过阅读源码,开发者可以学习到Vue组件的...
在实际开发过程中,应注重组件间的通信和状态管理,合理运用Vuex等工具,以确保应用程序的稳定性和可扩展性。同时,保持良好的代码组织和规范,遵循最佳实践,将有助于提高项目的可维护性和团队协作效率。 总之,...
在本案例中,我们关注的是一个基于JavaScript实现的无限滚动带宽可视化工具——scrollgraph。 ### 1. 滚动事件与滚动图 滚动图的关键在于监听用户的滚动事件,并在事件触发时更新图表。JavaScript的`window....
安装$ npm install zch-gulu// or install$ yarn add zch-gulu使用import { ZchButton } from 'zch-gulu'import 'zch-gulu/dist/index.css'<zch>Button特性:partying_face:开箱即用的高质量 Vue 组件。:gear:20+ 高...
1. KUKA Router软件:这可能是安装文件或配置文件,用于在KUKA控制系统上安装和设置插件。 2. 用户手册或指南:可能包含详细的操作步骤和示例,帮助用户理解和使用KUKA Router。 3. 可能的示例代码或脚本:用于演示...
自定义的图片滚动控件 github地址: https://github.com/gulu210/GLScrollPage_webImage-.git (加载网络图片的) https://github.com/gulu210/GLScrollPage-.git (加载本地图片的)
类的声明通常在头文件(.h)中进行,包含了类的接口,而在实现文件(.m)中编写类的方法。消息传递是Objective-C的核心,通过"[]"来发送消息给对象,例如:[object performTask]。 面向协议(Protocols)是...
4. 集合框架:List、Set、Map接口及其实现类,以及并发容器。 5. 输入输出流:文件操作、网络通信、序列化等。 6. 多线程:线程的创建、同步、通信方法。 7. Java虚拟机(JVM):内存模型、垃圾回收机制、性能优化。...
在iOS开发中,实现“ios滚动图片”的功能是一项常见的需求,尤其在制作广告轮播、产品展示等场景中。这个功能允许用户添加多张图片,并让它们以动态滚动的方式进行展示,提供良好的用户体验。以下是对这个主题的详细...