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等
  • 跟踪一下过程
  1. 创建会话、配置连接信息

    在会话中进行初始化了buf,packet,已经host,username等信息。而Session设计为一个线程任务(Session implements Runnable),一段会话是一次执行过程。此处未有PASSWORD的信息初试化,而是需要单独 session.setPassword(PASSWORD); ,可能是因为ssh连接时,先进行连接再进行密码认证。

    其他的一些配置:设置超时、等,对于客户端,超时处理是十分必要的。也是服务保障的关键。
  2. connect进行连接、通信
  • 创建socket,并进行IO的传输,至此传输层的处理结束
  1. 打开channel,进行应用层的处理
  • 根据type控制参数进行创建具体的Channell。
  • 创建初始化相应的请求队列,并进行逐一请求,写入读出IO流


三、其他网络工具包

网络工具包

以上是关于Jsch网络工具包的使用及源码简析的主要内容,如果未能解决你的问题,请参考以下文章

OkHttp简析及实现

OkHttp简析及实现

sftp批量上传及批量下载等最全功能的工具类SFTPUtils

并发工具-CyclicBarrier源码简析

开源软件包的安装及ntp时间服务器简析

Eclipse开发环境debug模式调试断点从jar跳到源码