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

Posted 刘林VIP

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jsch使用SSH协议连接到远程Shell执行脚本相关的知识,希望对你有一定的参考价值。

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


如果大家熟悉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:程序如下

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

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


使用SSH协议,连接到Linux,执行指定命令,并获取结果

步骤5~步骤6:程序如下

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


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


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


测试程序

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



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

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


完整程序

JSCHUtil.java



SSHCommUtil.java








以上是关于Jsch使用SSH协议连接到远程Shell执行脚本的主要内容,如果未能解决你的问题,请参考以下文章

使用 shell 脚本在远程机器上执行多个命令

在具有特定 mysql 主机的远程主机上使用 SSH 隧道连接到 MySql 数据库

通过 JSch shell 执行多个命令

使用 JSch 从 Java 连接到 SSH 服务器时出现“JSchException:拒绝 HostKey”

ssh(Secure Shell)

Remmina:无法使用 SSH 连接到远程服务器,但我可以从 shell SSH