Jsch使用SSH协议连接到远程Shell执行脚本

识字粗堪供赋役,不须辛苦慕公卿。这篇文章主要讲述Jsch使用SSH协议连接到远程Shell执行脚本相关的知识,希望能为你提供帮助。



如果大家熟悉Linux的话,一定对ssh,sftp,scp等命令非常熟悉,ssh是一个安全协议,用来在不同系统或者服务器之间进行安全连接,SSH 在连接和传送的过程中会加密所有的数据。
但是SSH一般是基于客户端的或者Linux命令行的,比如客户端的工具:OpenSSH,putty,SSH Tectia;
在linux上大家可以通过ssh username@host连接到所要想连接的主机。
但是如果在J2EE中,如何实现SSH呢?进而可以实现SCP,SFTP的功能呢?下面介绍的JSCH就可以实现下边的功能。
JSCH是一个纯粹的用java实现SSH功能的java   library;
JSCH API:??http://epaul.github.io/jsch-documentation/javadoc/??   
Example: ??http://www.jcraft.com/jsch/examples/?? 
maven依赖


关键类介绍

  • JSch:   作为中心配置点,以及Session的工厂;
  This class serves as a central configuration point, and as a factory for Session objects configured with these settings.
  1. Use getSession to start a new Session.
  2. Use one of the addIdentity methods for public-key authentication.
  3. Use setKnownHosts to enable checking of host keys.
  4. See setConfig for a list of configuration options.


  • Session:表示到远程SSH服务器的一个连接,可以包含多个Channels;
  A Session represents a connection to a SSH server.One session can contain multiple Channels of various types
A session is opened with connect() and closed with disconnect().


  • Channel :   与Session相关联的通道,有多种不同类型;
The abstract base class for the different types of channel which may be associated with a Session.
  1. shell - ChannelShell :A channel connected to a remote shell (本次使用的Channel)
  2. exec - ChannelExec :A channel connected to a remotely executing program
  3. direct-tcpip - ChannelDirectTCPIP: A Channel which allows forwarding a pair of local streams to/from a TCP-connection to a server on the remote side
  4. sftp - ChannelSftp :A Channel connected to an sftp server (as a subsystem of the ssh server).
  5. subsystem - ChannelSubsystem :A channel connected to a subsystem of the server process
使用步骤使用Jsch进行SSH连接的具体步骤如下:
  • 步骤1: 使用Jsch获取Session: jsch.getSession()
  • 步骤2: 设置Session的password和属性等: setPassword()/setConfig();
  • 步骤3: 设置SocketFactory(可以不进行设置,使用默认的TCP socket);
  • 步骤4: 打开Session连接:connect();
  • 步骤5: 打开并连接Channel:openChannel()/connect();
  • 步骤6: 获取Channel的inputStream和outputStream,执行指定cmd或其他;
  1. getInputStream():   All data arriving in SSH_MSG_CHANNEL_DATA messages from the remote side can be read from this stream
  2. getOutputStream():   All data written to this stream will be sent in SSH_MSG_CHANNEL_DATA messages to the remote side.
  • 步骤7: 关闭各种资源:输入输出流/Session/Channel等;
创建Session,并打开Session连接步骤1~步骤4:程序如下


使用SSH协议,连接到Linux,执行指定命令,并获取结果步骤5~步骤6:程序如下

执行Shell命令,并获取执行结果



测试程序






完整程序JSCHUtil.java

SSHCommUtil.java









【Jsch使用SSH协议连接到远程Shell执行脚本】


    推荐阅读