使用JSch实现SFTP文件传输

1、JSch开发包下载

http://www.jcraft.com/jsch/

目前最新版本为:jsch-0.1.51

2、简单例子,列出指定目录下的文件列表


import java.util.Properties;

import java.util.Vector;

import com.jcraft.jsch.ChannelSftp;

import com.jcraft.jsch.JSch;

import com.jcraft.jsch.Session;

public class Demo003 {

/**

* @param args

*/

public static void main(String[] args) throws Exception{

JSch jsch = new JSch();

Session session = jsch.getSession("cmb", "localhost");

session.setPassword("cmb123");

Properties config = new Properties();

config.put("StrictHostKeyChecking", "no");

session.setConfig(config);

session.connect();

ChannelSftp channelSftp = (ChannelSftp)session.openChannel("sftp");

channelSftp.connect();

channelSftp.setFilenameEncoding("gbk");

Vector vector  = channelSftp.ls("/");

try{

for(Object obj :vector){

if(obj instanceof com.jcraft.jsch.ChannelSftp.LsEntry){

String fileName = ((com.jcraft.jsch.ChannelSftp.LsEntry)obj).getFilename();

System.out.println(fileName);

}

}

}

finally{

channelSftp.quit();

session.disconnect();

}

}

}  

3、JSch实现SFTP功能一些主要类的介绍

1)JSch 类

2)Session 会话对象类

 

3)ChannelSFTP类

ChannelSFTP类是JSch实现SFTP核心类,它提供了一些SFTP常见的操作方法,如下

方法名 方法说明
put()    文件上传
get()  文件下载

cd()   
进入指定目录

ls()   
得到指定目录下的文件列表

rename() 
重命名(移动)指定文件或目录

rm()   
删除指定文件

mkdir()    
创建目录

rmdir()   
删除目录(只允许删除空目录)

注:以上这些方法都有很多重载方法

4)SftpProgressMonitor 传输进度监控类

5)LsEntry 可以认为是文件服务器上的文件条目信息,把包含文件或者目录相关属性 。ls命令返回的Vector中的就是LsEntry对象列表

4、SFTP文件传输的实现步骤

//1、创建JSch类,好比是FlashFXP工具

JSch jsch = new JSch();

//2、创建本次的文件传输会话对象,并连接到SFTP服务器。它好比是通过FlashFXP工具连接到SFTP服务器

session = jsch.getSession(username, host, port);

session.setPassword(passwd);

Properties config = new Properties();

config.put("StrictHostKeyChecking", "no");

session.setConfig(config);

session.connect();

try{

//3、在该session会话中开启一个SFTP通道,之后就可以在该通道中进行文件传输了

channelSftp = (ChannelSftp)session.openChannel("sftp");

channelSftp.connect();

}catch(Exception e){

e.printStackTrace();

disConnect();

throw e;

}

//4、进行文件传输操作:put()、get()....

channelSftp.put(...)

//5、操作完毕后,关闭通道并退出本次会话

if(channelSftp!=null && channelSftp.isConnected()){

channelSftp.disconnect();

}

if(session!=null && session.isConnected()){

session.disconnect();

}

5、JSch中文乱码处理

     使用jsch-0.1.51进行SFTP文件传输时,对中文处理会出现乱码,并且也无法通过setFileNameEncoding()方法来设置编码。

     解决方案:

         下载jsch-0.1.51源代码,在ChannelSFTP.java文件中找到SENDINIT( )方法,修改红色部分的内容

private void sendINIT() throws Exception {

this.packet.reset();

putHEAD((byte)1, 5);

this.buf.putInt(3);   //修改为  this.buf.putInt(2);

getSession().write(this.packet, this, 9);

}

然后编译并更改jar中的对应class文件即可。

6、ChannelSftp类的主要API说明如下:

方法名 方法说明
public
void put(String src, String dst)
将本地文件名为src的文件上传到目标服务器,目标文件名为dst,若dst为目录,则目标文件名将与src文件名相同。采用默认的传输模式:OVERWRITE
public void put(String src, String dst, int mode) 将本地文件名为src的文件上传到目标服务器,目标文件名为dst,若dst为目录,则目标文件名将与src文件名相同。指定文件传输模式为mode(mode可选值为:ChannelSftp.OVERWRITE,ChannelSftp.RESUME,ChannelSftp.APPEND)。
public
void put(String src, String dst, SftpProgressMonitor monitor)
将本地文件名为src的文件上传到目标服务器,目标文件名为dst,若dst为目录,则目标文件名将与src文件名相同。采用默认的传输模式:OVERWRITE,并使用实现了SftpProgressMonitor接口的monitor对象来监控文件传输的进度。
public void put(String src, String dst,SftpProgressMonitor
monitor, int mode) 
将本地文件名为src的文件上传到目标服务器,目标文件名为dst,若dst为目录,则目标文件名将与src文件名相同。指定传输模式为mode,并使用实现了SftpProgressMonitor接口的monitor对象来监控文件传输的进度。
public void put(InputStream src, String dst) 将本地的input stream对象src上传到目标服务器,目标文件名为dst,dst不能为目录。采用默认的传输模式:OVERWRITE
public void put(InputStream src, String dst, int
mode)
将本地的input stream对象src上传到目标服务器,目标文件名为dst,dst不能为目录。指定文件传输模式为mode
public void put(InputStream src, String dst, SftpProgressMonitor
monitor)
将本地的input stream对象src上传到目标服务器,目标文件名为dst,dst不能为目录。采用默认的传输模式:OVERWRITE。并使用实现了SftpProgressMonitor接口的monitor对象来监控传输的进度。
public void put(InputStream src, String dst,SftpProgressMonitor
monitor, int mode) 
将本地的input stream对象src上传到目标服务器,目标文件名为dst,dst不能为目录。指定文件传输模式为mode。并使用实现了SftpProgressMonitor接口的monitor对象来监控传输的进度。
public OutputStream put(String dst) 该方法返回一个输出流,可以向该输出流中写入数据,最终将数据传输到目标服务器,目标文件名为dst,dst不能为目录。采用默认的传输模式:OVERWRITE
public OutputStream put(String dst, final int
mode)
该方法返回一个输出流,可以向该输出流中写入数据,最终将数据传输到目标服务器,目标文件名为dst,dst不能为目录。指定文件传输模式为mode
public OutputStream put(String dst, final SftpProgressMonitor
monitor, final int mode) 
该方法返回一个输出流,可以向该输出流中写入数据,最终将数据传输到目标服务器,目标文件名为dst,dst不能为目录。指定文件传输模式为mode。并使用实现了SftpProgressMonitor接口的monitor对象来监控传输的进度。
public OutputStream put(String dst, final SftpProgressMonitor
monitor, final int mode, long offset)
该方法返回一个输出流,可以向该输出流中写入数据,最终将数据传输到目标服务器,目标文件名为dst,dst不能为目录。指定文件传输模式为mode。并使用实现了SftpProgressMonitor接口的monitor对象来监控传输的进度。offset指定了一个偏移量,从输出流偏移offset开始写入数据。
get(String src, String dst) 下载文件到本地,src为目标服务器上的文件,不能为目录,dst为本地文件路径。若dst为目录,则本地文件名与目标服务器上的文件名一样。
get(String src, String dst ,SftpProgressMonitor monitor) 同get(String
src, String dst),只是该方法允许传入传输进度的监控对象monitor。
get(String src, String dst ,SftpProgressMonitor monitor ,int
mode)
同get(String src, String dst
,SftpProgressMonitor monitor),同时,该方法增加了mode参数,允许指定文件传输模式
rm(String path) 删除文件,path不能为目录,删除目录使用rmdir
rmdir(String path) 删除目录,但是只能删除空目录
rename(String oldpath, String newpath) 如果oldPath为目录,不要求目录必须为空
如果newpath为目录,则newpath必须不能存在,如果已经存在该目录,则会出现重名或者移动失败
1、重命名文件或者目录
2、移动文件或者目录
ls(String path) 列出指定目录下的所有文件和子目录。该方法返回Vector对象,该列表具体存放的是LsEntry对象
时间: 2024-10-10 05:38:20

使用JSch实现SFTP文件传输的相关文章

FileUpload 上传文件,并实现c#使用Renci.SshNet.dll实现SFTP文件传输

fileupload上传文件和jquery的uplodify控件使用方法类似,对服务器控件不是很熟悉,记录一下. 主要是记录新接触的sftp文件上传.服务器环境下使用freesshd搭建好环境后,windos环境下可视化工具filezilla可#以很容易实现文件的传输. 本例中主要是c#使用Renci.SshNet.dll实现SFTP文件传输. 代码如下: protected void btnExcelImport_Click(object sender, EventArgs e) { if (

C# FTP/SFTP文件传输控件FTP for .NET/.NET CF 详细介绍

FTP for .NET将FTP客户端功能添加到您的应用程序之中..NET控件的FTP支持所有常用的FTP服务器以及代理服务器,包括可扩展的目录解析.同步以及异步操作.主动与被动模式.以VB.NET与C#编写的样本示例. 功能特征: 100%可托管的代码 遵循CLS(通用语言规范) 稳定以及彻底通过测试的代码. 可选择获取完整的C#源代码. 支持.NET 1.0..NET 1.1..NET 2.0/3.0/3.5 在Windows CE以及PocketPC设备上能使用.NET CF 1.0以及2

xshell sftp 文件传输

点击下方的小图标 取消 进入到下图界面后,直接将文件拖拽即可 原文地址:https://www.cnblogs.com/longlogs/p/11773761.html

SFTP文件上传与下载

SFTP是对ftp进行加密的一种文件协议. 首先是先引入:jsch-0.1.42-sources.jar与jsch-0.1.42.jar包 SFTP文件上传与下载. import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.Properties; import java.util.Vector; import com.jcraft.jsch.Chan

Linux下几种文件传输命令 sz rz sftp scp

最近在部署系统时接触了一些文件传输命令,分别做一下简单记录: 1.sftp Secure Ftp 是一个基于SSH安全协议的文件传输管理工具.由于它是基于SSH的,会在传输过程中对用户的密码.数据等敏感信息进行加密,因此可以有效的防止用户信息在传输的过程中被窃取,比FTP有更高的安全性.在功能方面与FTP很类似,不仅可以传输文件数据,而且可以进行远程的文件管理(如建立,删除,查看文件列表等操作).Sftp与ftp虽然只有一字之差,但基于的传输协议却是不同的.因此不能用sftp client去连接

[原创] Linux下几种文件传输命令 sz rz sftp scp介绍

Linux下几种文件传输命令 sz rz sftp scp介绍 1.sftp Secure Ftp 是一个基于SSH安全协议的文件传输管理工具.由于它是基于SSH的,会在传输过程中对用户的密码.数据等敏感信息进行加密,因此可以有效的防止用户信息在传输的过程中被窃取,比FTP有更高的安全性.在功能方面与FTP很类似,不仅可以传输文件数据,而且可以进行远程的文件管理(如建立,删除,查看文件列表等操作).Sftp与ftp虽然只有一字之差,但基于的传输协议却是不同的.因此不能用sftp client去连

linux sftp 安全文件传输命令

sftp 是一个交互式文件传输程式.它类似于 ftp, 但它进行加密传输,比FTP有更高的安全性. 1.常用登陆方式: 格式:sftp <user>@<host> 通过sftp连接<host>,端口为默认的22,指定用户<user>. 2.查看sftp支持的命令 使用help命令,查看支持的命令,如: sftp>help (其中命令前面有"l"表示本地执行,其他表示在所登录的远程主机上面执行) 3.基本的使用 sftp主要是用来传输

FTPS (FTP over SSL) vs. SFTP (SSH 文件传输协议): 我们如何做出选择

第一个RFC的FTP协议发布通过网络使用FTP协议(由RFC 959或更高版本)的文件传输始于1980年,FTP提供上传,下载和删除文件,创建和删除目录,读取目录内容的功能.虽然FTP是非常受欢迎的,它有一些缺点,使其更难使用.主要的缺点是缺乏目录列表的统一格式(这个问题已经通过引入MLST命令部分解决,但是一些服务器不支持)和辅助连接(DATA连接)的存在.FTP中的安全性通过对RFC 2228中定义的信道加密采用SSL / TLS协议来提供.FTP的安全版本称为FTPS. 在UNIX系统中,

文件传输协议FTP、SFTP和SCP

网络通信协议分层 应用层: HTTP(Hypertext Transfer Protocol 超文本传输协议,显示网页) DNS(Domain Name System) FTP(File Transfer Protocol) SFTP(SSH File Transfer Protocol,和FTP不一样) SCP(Secure copy,based on SSH) SSH (Secure Shell) 通信层: TCP(Transmission Control Protocol 三次握手传输协议