Jsch网络工具包的使用及源码简析
Posted adventure.Li
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jsch网络工具包的使用及源码简析相关的知识,希望对你有一定的参考价值。
一、背景
最近,导师安排了些看论文文献并整理论文至文件服务器的工作,在实验的过程中,我们知道常见的上传文件至服务器有以下方式。
- ftp/sftp协议进行上传
- ssh连接,并通过scp命令进行上传
- 通过xftp、xshell、ftplina等图形化工具上传
还记得大二刚学编程时,觉得采用xftp上传文件到服务器,并且能通过静态服务器nginx去访问这些静态资源,就觉得很厉害。也固化认为上传文件就得需要这工具,后面学习了计算机网络,才知道,图形化工具的本身也是通过调用底层的通信API进行交互,而交互的过程则需要协议去标准化。那么,Java这样的高级语言也肯定有相应的包去处理这网络通信,经了解,Jsch则可以满足;
二、Jsch的基本介绍
基本介绍
JSch 是 SSH2
的一个纯 Java 实现。它允许你连接到一个 sshd 服务器,使用端口转发,X11 转发,文件传输等等。你可以将它的功能集成到你自己的 程序中。同时该项目也提供一个 J2ME 版本用来在手机上直连 SSHD 服务器。
SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH 为建立在应用层基础上的安全协议。SSH 是较可靠,专为远程登录会话和其他网络服务提供安全性
的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。
简单使用
从基本介绍,我们可以明白该包是基于ssh,估计也可以使用shell进行操作。另外是基于应用层,那么我们根据ISO模型,也大致可以去推测它的设计,可能会有session会话设计、socket进行通信,而对于IP网络、路由则无需应用程序去考虑。基于该概念,看看简单的使用。
- 创建JSch的对象
- 创建会话,并进行连接会话(HOST、PORT,通信的本质是进程之间的通信,可以联系JDBC、Netty等通信设计)
- 进行验证、设置密码(可同第二步)
- 进行请求连接、
- 获取通道,通信的过程实则为IO的连接过程
- 进行sftp的操作,例如get\\put等,sftp协议提供的相应指令
public class SftpUtil
private final static String HOST = "192.168.159.144";
private final static String USER_NAME = "root";
private final static String PASSWORD = "123321";
private final static Integer PORT = 22;
@Test
public void testSftp()
// ChannelSf
//ChannelSftp channelSftp = new ChannelSftp();
// 1.创建对象
JSch jSch = new JSch();
// 2.创建会话--会话层--sftp应用层协议 向下 是会话层
try
Session session = jSch.getSession(USER_NAME,HOST,PORT);
session.setPassword(PASSWORD);
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.setTimeout(30000);
// 分析 该方法的实现过程,如何采用socket进行通信实现
session.connect();
ChannelSftp channelSftp = (ChannelSftp) session.openChannel("sftp");
channelSftp.connect();
System.out.println(channelSftp.lpwd());// 结合shell脚本命令--高级逻辑式编程语言+shell脚本式语言 → 联系、贯通
catch (JSchException e)
e.printStackTrace();
简单看看源码设计
Jsch是去请求服务端,并进行连接操作,因此只设计client端的设计,而不关心服务端。
- 整体结构
对于端的设计:Request+Socket;Request抽象类、RequestSftp\\ RequestShell等子类。
对于消息的设计:Channel + Buffer + Packet
对于通信的建立:Session + IO
对于安全保证:UserAuth + Config等
- 跟踪一下过程
- 创建会话、配置连接信息
在会话中进行初始化了buf,packet,已经host,username等信息。而Session设计为一个线程任务(Session implements Runnable),一段会话是一次执行过程。此处未有PASSWORD的信息初试化,而是需要单独session.setPassword(PASSWORD);
,可能是因为ssh连接时,先进行连接再进行密码认证。
其他的一些配置:设置超时、等,对于客户端,超时处理是十分必要的。也是服务保障的关键。
- connect进行连接、通信
- 创建socket,并进行IO的传输,至此传输层的处理结束
- 打开channel,进行应用层的处理
- 根据type控制参数进行创建具体的Channell。
- 创建初始化相应的请求队列,并进行逐一请求,写入读出IO流
三、其他网络工具包
以上是关于Jsch网络工具包的使用及源码简析的主要内容,如果未能解决你的问题,请参考以下文章