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;i v=null; if(fileExtension!=null&&"".equals(fileExtension)){ v=sftp.ls("*"+fileExtension); }else{ //v=sftp.ls("");//此处有风险 log.warn("FileExtensionisnotnull!PleaseCheck"); } for(inti=0;i 这就是整个工具的内容了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。