Java工具jsch.jar实现上传下载
在做运维的时候,我们一般使用shell脚本实现文件的服务器之间定时传输,那么对于一些不会shell脚本的童鞋,就得使用万能的编程语言了,这里我们介绍一款Java操作ftp的工具,那就是jsch.jar。工具已经写好,可以根据实际情况做调整,注释很清晰。大家按需阅读:
packagecom.wdy.tools.utils.sftputil;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileOutputStream;
importjava.io.InputStream;
importjava.io.OutputStream;
importjava.util.Arrays;
importjava.util.Collections;
importjava.util.Properties;
importjava.util.Vector;
importorg.apache.commons.logging.Log;
importorg.apache.commons.logging.LogFactory;
importcom.jcraft.jsch.Channel;
importcom.jcraft.jsch.ChannelSftp;
importcom.jcraft.jsch.JSch;
importcom.jcraft.jsch.Session;
/**
*利用jsch.jar针对sftp的上传和下载
*需要jar包:
*commons-lang3-3.2.1.jar
*commons-logging.jar
*jsch-0.1.53.jar
*log4j-1.2.17.jar
*@authorwangdy
*
*/
publicclassJschSftpUtils{
privatestaticfinalLoglog=LogFactory.getLog(JschSftpUtils.class);
/**
*利用JSch包实现SFTP下载文件
*(这里是将serverPath下的指定扩展名的文件,全部下载到localPath下)
*@paramip主机IP
*@paramuser主机登陆用户名
*@parampsw主机登陆密码
*@paramport主机ssh2登陆端口,如果取默认值,传<=0的值,如-1
*@paramlocalPath下载的本地目录的路径
*@paramserverPath服务器目录
*@paramfileExetension文件扩展名,格式如:'.txt'
*@paramisDelete是否删除该路径下扩展名为fileExetension的远程文件
*@throwsException
*/
publicstaticvoidsshSftpDownload(Stringip,Stringuser,Stringpsw,intport,StringserverPath,StringlocalPath,StringfileExtension,booleanisDelete)throwsException{
Sessionsession=null;
Channelchannel=null;
JSchjsch=newJSch();
if(port<=0){
//连接服务器,采用默认端口
session=jsch.getSession(user,ip);
}else{
//采用指定的端口连接服务器
session=jsch.getSession(user,ip,port);
}
//如果服务器连接不上,则抛出异常
if(session==null){
thrownewException("sessionisnull");
}
//设置登陆主机的密码
session.setPassword(psw);//设置密码
//设置第一次登陆的时候提示,可选值:(ask|yes|no)
//session.setConfig("StrictHostKeyChecking","no");
PropertiessshConfig=newProperties();
sshConfig.put("StrictHostKeyChecking","no");
session.setConfig(sshConfig);
//设置登陆超时时间ms
//session.connect(640);
session.connect();
log.info("Sessionconnected.");
log.info("OpeningChannel.");
try{
//创建sftp通信通道
channel=(Channel)session.openChannel("sftp");
channel.connect();
//channel.connect(1000);
ChannelSftpsftp=(ChannelSftp)channel;
log.info("Connectedto"+ip+".");
//进入服务器指定的文件夹
sftp.cd(serverPath);
/**
*列出服务器指定的文件列表(可以加参数,指明要下载的文件类型)
*说明:如果fileExtension不为空,则下载指定扩展名的文件集;
*如果fileExtension为"",则下载该目录下所有类型的文件,如果是文件夹的话,会报错,如果您路径下有以.连接的文件夹,请注意,这是不可以的,程序会在过滤到该文件夹时中断
*/
Vector>v=null;
if(fileExtension!=null&&!"".equals(fileExtension)){
v=sftp.ls("*"+fileExtension);
}else{
try{
v=sftp.ls("*.*");//ls-al|grep\"^-\"只显示文件---//ls-al|grep"^d"只显示目录包括.和..
}catch(Exceptione){
log.info("您操作的是一个文件夹!");
}
}
for(inti=0;i>>>下载到目录["+localPath+"]中.");
//下载成功后,删除文件
if(isDelete){
deleteOneFile(serverPath,fileName,sftp);
log.info("文件["+fileName+"]删除成功!");
}
}
}catch(Exceptione){
e.printStackTrace();
}finally{
session.disconnect();
channel.disconnect();
}
}
/**
*利用JSch包实现SFTP上传文件
*@paramip主机IP
*@paramuser主机登陆用户名
*@parampsw主机登陆密码
*@paramport主机ssh2登陆端口,如果取默认值,传<=0的值,如-1
*@paramlocalPath本地目录
*@paramserverPath服务器目录
*@paramfileExtension上传文件的扩展名格式如:'.txt'
*/
publicstaticvoidsshSftpUpload(Stringip,Stringuser,Stringpsw,intport,StringlocalPath,StringserverPath,StringfileExtension)throwsException{
Sessionsession=null;
Channelchannel=null;
JSchjsch=newJSch();
if(port<=0){
//连接服务器,采用默认端口
session=jsch.getSession(user,ip);
}else{
//采用指定的端口连接服务器
session=jsch.getSession(user,ip,port);
}
//如果服务器连接不上,则抛出异常
if(session==null){
log.info("sessionisnull,服务器连接失败");
thrownewException("sessionisnull,服务器连接失败");
}else{
log.info("ConnectedSuccess,ipis["+ip+"]");
}
//设置登陆主机的密码
session.setPassword(psw);//设置密码
//设置第一次登陆的时候提示,可选值:(ask|yes|no)
session.setConfig("StrictHostKeyChecking","no");
//设置登陆超时时间ms
session.connect(960);
try{
//创建sftp通信通道
channel=(Channel)session.openChannel("sftp");
channel.connect(1000);
ChannelSftpsftp=(ChannelSftp)channel;
//进入服务器指定的文件夹
sftp.cd(serverPath);
//列出服务器指定的文件列表
//Vectorv=sftp.ls("*.sh");
//for(inti=0;i>>>上传到目录["+serverPath+"]中.");
}else{
log.info("警告:文件["+fileName+"]不是指定类型["+fileExtension+"]的文件");
}
}else{//如果扩展名为空,则上传该路径下的所有文件
OutputStreamoutstream=sftp.put(fileName);//要上传到服务器的文件,可以另外设个名字,也可以用本地的名称
InputStreaminstream=newFileInputStream(newFile(localPath+"/"+fileName));//本地文件
byteb[]=newbyte[1024];
intn;
while((n=instream.read(b))!=-1){
outstream.write(b,0,n);
}
outstream.flush();
outstream.close();
instream.close();
log.info("文件["+fileName+"]上传成功!---->>>>上传到目录["+serverPath+"]中.");
}
}
}catch(Exceptione){
e.printStackTrace();
}finally{
session.disconnect();
channel.disconnect();
}
}
/**
*利用JSch包实现SFTP下载、上传文件(该方法暂不适用)
*@paramip主机IP
*@paramuser主机登陆用户名
*@parampsw主机登陆密码
*@paramport主机ssh2登陆端口,如果取默认值(默认值22),传-1
*@paramprivateKey密钥文件路径
*@parampassphrase密钥的密码
*
*/
publicstaticvoidsshSftp(Stringip,Stringuser,Stringpsw,intport,StringprivateKey,Stringpassphrase)throwsException{
Sessionsession=null;
Channelchannel=null;
JSchjsch=newJSch();
//设置密钥和密码
if(privateKey!=null&&!"".equals(privateKey)){
if(passphrase!=null&&"".equals(passphrase)){
//设置带口令的密钥
jsch.addIdentity(privateKey,passphrase);
}else{
//设置不带口令的密钥
jsch.addIdentity(privateKey);
}
}
if(port<=0){
//连接服务器,采用默认端口
session=jsch.getSession(user,ip);
}else{
//采用指定的端口连接服务器
session=jsch.getSession(user,ip,port);
}
//如果服务器连接不上,则抛出异常
if(session==null){
thrownewException("sessionisnull");
}
//设置登陆主机的密码
session.setPassword(psw);//设置密码
//设置第一次登陆的时候提示,可选值:(ask|yes|no)
session.setConfig("StrictHostKeyChecking","no");
//设置登陆超时时间
session.connect(30000);
try{
//创建sftp通信通道
channel=(Channel)session.openChannel("sftp");
channel.connect(1000);
ChannelSftpsftp=(ChannelSftp)channel;
//进入服务器指定的文件夹
sftp.cd("domains");
//列出服务器指定的文件列表
Vector>v=sftp.ls("*.txt");
for(inti=0;iv=null;
if(fileExtension!=null&&"".equals(fileExtension)){
v=sftp.ls("*"+fileExtension);
}else{
//v=sftp.ls("");//此处有风险
log.warn("FileExtensionisnotnull!PleaseCheck");
}
for(inti=0;i
这就是整个工具的内容了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。