jsch教程
jsch是ssh2的一个纯Java实现。它允许你连接到一个sshd服务器,使用端口转发,X11转发,文件传输等等。你可以将它的功能集成到你自己的程序中。同时该项目也提供一个J2ME版本用来在手机上直连SSHD服务器。
####一般连接到服务器有两种方式:
1、通过用户名和密码连接,缺点(出于安全需要,一般服务器的密码会定期修改,程序部署后将不得不经常更新配置文件中的密 码。)
2、通过用户名和ssh private key file连接,缺点(因为Java程序必须和private key file在同一台机器上,将服务器的private key file复制到本地后,本地机器的安全措施可能会使private key file被窃取,威胁服务器安全。)
jsch官网地址为http://www.jcraft.com/jsch/,实现jsch功能需要添加一个jsch-0.1.51.jar包,官网有一些例子可直接下载参考。
maven的配置为:
|
|
jsch连接到Linux的基本原理和用ssh一样,需要ip地址,端口(一般为22),用户名,密码,为了方便配置,可以把静态变量初始化在配置文件中:
|
|
获取配置文件变量的工具类:
|
|
获取脚本的方法通过一个工具类读取这个配置文件,用dom4j进行解析,获取相应指定shell name的脚本,例如
|
|
获取脚本的方法通过一个工具类读取这个配置文件,用dom4j进行解析,获取相应指定shell name的脚本,例如
|
|
#JSCH实现原理:
jsch进行连接服务器连接时可以看做时java的jdbc连接,首先我们需要实例化一个jsch对象,再利用这个对象 根据用户名,主机ip,端口获取一个Session对象,设置好相应的参数后,就进行连接,创建连接后这个session是一直可用的,所以不需要关闭。之后我们需要在session上建立channel通道
Channel的类型可以为如下类型:
shell - ChannelShell exec - ChannelExec
direct-tcpip - ChannelDirectTCPIP sftp - ChannelSftp subsystem - ChannelSubsystem
其中,ChannelShell和ChannelExec比较类似,都可以作为执行Shell脚本的Channel类型。它们有一个比较重要的区别:ChannelShell可以看作是执行一个交互式的Shell,而ChannelExec是执行一个Shell脚本。
实现远程命令操作我们需要创建ChannelExec对象。
实现文件上传下载我们需要实现ChannelSftp对象。
ChannelSftp类是JSch实现SFTP核心类,它包含了所有SFTP的方法,如:
put(): 文件上传
get(): 文件下载
cd(): 进入指定目录
ls(): 得到指定目录下的文件列表
rename(): 重命名指定文件或目录
rm(): 删除指定文件
mkdir(): 创建目录
rmdir(): 删除目录下面有个工具类展示
应用实例:
JschUtil.java
|
|
|
|
|
|
#注:工具类主要封装了三个方法
1.执行脚本命令
2.文件上传(为了做进度监控,需要用到监控类FileProgressMonitor.java)
3.文件下载 (为了做进度监控,需要用到监控类MyProgressMonitor.java)
JschUtil.java工具类的几个使用步骤如下
1.初始化连接参数
2.调用connect()方法进行连接
3.执行相应的方法,如果是脚本命令,先用ShellConfigUtil.java获取相应的脚本,再执行(jsch执行脚本的方式是同步,就是要等到脚本执行结束才返回结果,如果没有返回就一直等着,应该不支持交互式命令,比如连接到某个数据库,然后执行相应的操作)
4.最后关闭连接
例子只针对单台服务器的操作,如果需要同时操作多台服务器,可在原有基础上做修改。