Java操作sftp.doc_第1页
Java操作sftp.doc_第2页
Java操作sftp.doc_第3页
Java操作sftp.doc_第4页
Java操作sftp.doc_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

importjava.io.File; importjava.io.FileInputStream; importjava.io.IOException; importjava.io.InputStream; importjava.io.OutputStream; importjava.util.ArrayList; importjava.util.List; importjava.util.Vector; importcom.jcraft.jsch.Channel; importcom.jcraft.jsch.ChannelSftp; importcom.jcraft.jsch.JSch; importcom.jcraft.jsch.JSchException; importcom.jcraft.jsch.Session; importcom.jcraft.jsch.SftpException; mon.util.log.EventLog; /* *InorderforSSH2tunnelingtofunctioncorrectlyonemustensurethatthe *followinglineisuncommentedin/etc/ssh/sshd_config: *-CUT- *#Changetoyestoenabletunnelledcleartextpasswords *PasswordAuthenticationyes *-CUT- *Otherwisetheinitiationofthetunnelwillfailwith *SSHInitializationfailed,tryagain? *com.jcraft.jsch.JSchException:Authfail *authoraimer.xu * */publicclassSftpHelperextendsThread privatestaticEventLoglog=newEventLog(SftpHelper.class); privateStringhost; privateStringusername; privateStringpassword; privateStringlocation; privateintport; privateStringknowHosts; privateStringosName; privateListfilenames=newArrayList(); publicSftpHelper(Stringhost,Stringusername,Stringpassword,intport) this(host,username,password,port,); publicSftpHelper(Stringhost,Stringusername,Stringpassword,intport,Stringlocation) this.host=host; this.username=username; this.password=password; this.port=port; osName=System.getProperty(); if(osName.toUpperCase().indexOf(WINDOWS)-1) this.knowHosts=c:known_hosts; if(location=null|location.length()=0) this.location=c:; else this.knowHosts=/root/.ssh/known_hosts; if(location=null|location.length()=0) this.location=/; this.location=location; publicvoidaddFilename(Stringfilename) filenames.add(filename); publicvoidsetFilenames(Listfilenames) this.filenames=filenames; publicvoidrun() upload(); /* *要上传的文件必须包含完整的路径 * */publicbooleanupload() if(filenames.size()=0) returnfalse; Sessionsession; Channelchannel; JSchjsch=newJSch(); try jsch.setKnownHosts(knowHosts); session=jsch.getSession(username,host,port); session.setPassword(password); session.connect(); channel=session.openChannel(sftp); channel.connect(); ChannelSftpc=(ChannelSftp)channel; c.cd(location); InputStreamin=null; OutputStreamout=null; for(inti=0;ifilenames.size();i+) Stringfilename=filenames.get(i); if(filename=null|.equals(filename) log.Debug(,当前没有要上传的文件!); continue; intidx=filename.lastIndexOf(File.separator); Stringuploadname=filename.substring(idx=-1?0:idx+1); out=c.put(uploadname); log.Debug(,sleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeep+5000+ms!); sleep(5000); in=newFileInputStream(filename); /Stringsuffix=filename.substring(filename.lastIndexOf(.)+1); /if(gz.equals(suffix) /in=newGZIPInputStream(in); / byteb=newbyte1024; intn; while(n=in.read(b)!=-1) out.write(b); out.flush(); out.close(); in.close(); c.disconnect(); session.disconnect(); sleep(500); returntrue; catch(JSchExceptione) e.printStackTrace(); catch(SftpExceptione) e.printStackTrace(); catch(IOExceptione) e.printStackTrace(); catch(InterruptedExceptione) e.printStackTrace(); returnfalse; publicstaticvoidmain(Stringargs) Stringusername=root; Stringhost=*.*.*.*; intport=22; Stringpassword=*; Stringpath=/home/data/download/; SftpHelperhelper=newSftpHelper(host,username,password,port,path); helper.addFilename(c:bcp.sql); helper.addFilename(c:a.sql); /helper.upload(c:bcp.sql); helper.start(); import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.util.ArrayList;import java.util.List;import java.util.Vector;import com.jcraft.jsch.Channel;import com.jcraft.jsch.ChannelSftp;import com.jcraft.jsch.JSch;import com.jcraft.jsch.JSchException;import com.jcraft.jsch.Session;import com.jcraft.jsch.SftpException;import mon.util.log.EventLog;/* * In order for SSH2 tunneling to function correctly one must ensure that the * following line is uncommented in /etc/ssh/sshd_config : * -CUT- * # Change to yes to enable tunnelled clear text passwords * PasswordAuthentication yes * -CUT- * Otherwise the initiation of the tunnel will fail with * SSH Initialization failed, try again? * com.jcraft.jsch.JSchException: Auth fail * author aimer.xu * */public class SftpHelper extends Thread private static EventLog log = new EventLog(SftpHelper.class);private String host;private String username;private String password;private String location;private int port;private String knowHosts;private String osName;private List filenames = new ArrayList();public SftpHelper(String host, String username, String password, int port) this(host, username, password, port, );public SftpHelper(String host, String username, String password, int port, String location) this.host = host;this.username = username;this.password = password;this.port = port;osName = System.getProperty();if (osName.toUpperCase().indexOf(WINDOWS) -1) this.knowHosts = c:known_hosts; if(location = null | location.length() = 0) this.location = c:; else this.knowHosts = /root/.ssh/known_hosts; if(location = null | location.length() = 0) this.location = /; this.location = location;public void addFilename(String filename)filenames.add(filename);public void setFilenames(List filenames)this.filenames = filenames;public void run()upload();/* * 要上传的文件必须包含完整的路径 * */public boolean upload()if(filenames.size() = 0)return false;Session session;Channel channel;JSch jsch = new JSch();try jsch.setKnownHosts(knowHosts);session = jsch.getSession(username, host, port);session.setPassword(password);session.connect();channel = session.openChannel(sftp);channel.connect();ChannelSftp c = (ChannelSftp)channel;c.cd(location);InputStream in = null;OutputStream out = null;for(int i=0; ifilenames.size(); i+)String filename = filenames.get(i);if(filename = null | .equals(filename)log.Debug(, 当前没有要上传的文件!);continue;int idx= filename.lastIndexOf(File.separator);String uploadname = filename.substring(idx=-1?0:idx+1);out = c.put(uploadname);log.Debug(, sleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeep +5000+ms!);sleep(5000);in = new FileInputStream(filename);/String suffix = filename.substring(filename.lastIndexOf(.)+1);/if(gz.equals(suffix)/in = new GZIPInputStream(in);/byte b = new byte1024;int n;while (n = in.read(b) != -1) out.write(b);out.flush();out.close();in.close();c.disconnect();session.disconnect();sleep(500);return true; catch (JSchException e) e.printStackTrace(); catch (SftpException e) e.printStackTrace(); catch (IOException e) e.printStackTrace(); catch(InterruptedException e)e.printStackTrace();return false;public static void main(String args)String username = root;String host = *.*.*.*;int port = 22;String password = *;String path = /home/data/download/;SftpHelper helper = new SftpHelper(host, username,password, port,path);helper.addFilename(c:bcp.sql);helper.addFilename(c:a.sql);/helper.upload(c:bcp.sql);helper.start();请注意类的注释部分,known_hosts文件的内容如下:Java代码 90ssh-rsaAAAAB3NzaC1yc2EAAAABIwAAAIEA6tHmMBQwcSieFneaObnDyzthMSn1FyWFp/TCMV4rt+ZEtOZo49GK0kdM3tYy1IQD8hZz016JG5uOIbrBN+O0BtzY89y3uIwo0hsYQtP/LKAR5BU+pT3R20ltVbcEGzrSpKiSClObD9MbiOt0899Du9bG89/BiMvxUxj/Rhg33l0=90 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEA6tHmMBQwcSieFneaObnDyzthMSn1FyWFp/TCMV4rt+ZEtOZo49GK0kdM3tYy1IQD8hZz016JG5uOIbrBN+O0BtzY89y3uIwo0hsYQtP/LKAR5BU+pT3R20ltVbcEGzrSpKiSClObD9MbiOt0899Du9bG89/BiMvxUxj/Rhg33l0=写道附:产生此文件的简单方法:可以在Linux中用ssh命令登录一次,这样便在/root/.ssh(假如使用root用户登录到Linux)目录下生成known_hosts文件。 /* * */package com.test.tool;import mons.vfs.FileObject; import mons.vfs.FileSystemException; import mons.vfs.FileSystemOptions; import mons.vfs.Selectors; import mons.vfs.cache.DefaultFilesCache; import mons.vfs.impl.DefaultFileSystemManager; import vider.local.DefaultLocalFileProvider; import vider.sftp.SftpFileProvider; import vider.sftp.SftpFileSystemConfigBuilder; import vider.zip.ZipFileProvider; import mons.logging.*;/* 15. * author myao Update:2006-7-1810:40:46 16. */ public class AutoChecker private String _sourceroot = C:/vfsroot; private String _targetroot = sftp:/odpuser:odpuser1:22/doc-root/myaoVfstest/; / b1:f1:ef:26:3e:5f:a5:0d:70:fa:5e:df:d9:6b:55:41 private FileObject localfs, targetfs; private DefaultFileSystemManager vfsmgr; private Log log = LogFactory.getLog(AutoChecker.class); AutoChecker() try init(); catch (FileSystemException e) e.printStackTrace(); void init() throws FileSystemException vfsmgr = getDefaultFileSystemManager(); void moveFile(String sourcePath, String targetPath) throws FileSystemException localfs = vfsmgr.resolveFile(sourcePath); if (!localfs.exists() localfs.createFolder(); / localfs. / vfsmgr. FileSystemOptions opts = new FileSystemOptions(); SftpFileSystemConfigBuilder.getInstance().setStrictHostKeyChecking( opts, no); targetfs = vfsmgr.resolveFile(targetPath, opts); if (!targetfs.exists() targetfs.createFolder(); try long startTime = System.currentTimeMillis(); / System.out.println(Source File: + source.getChildren().length); targetfs.copyFrom(localfs, Selectors.SELECT_FILES); / System.out.println(Target File: + target.getChildren().length); / TODO 要想办法用遍历的方法来拷贝文件,否则无法留下拷贝的细节。 /正在装载数据 / FileObject flist = localfs.getChildren(); / for (int i = 0; i flist.length; i+) / FileObject tmp = vfsmgr.resolveFile(targetfs, flisti.getName() / .getBaseName(); / if (!tmp.exists() / tmp.createFile(); / / / VfsMutiMove t = new VfsMutiMove(flisti, tmp); / t.run(); / / tmp.copyFrom(flisti, Selectors.SELECT_SELF); / long endTime = System.currentTimeMillis(); System.out.println(this.getClass().getName(); System.out.println(Cost time(ms:): + (endTime - startTime); catch (FileSystemException e) e.printStackTrace(); private DefaultFileSystemManager getDefaultFileSystemManager() DefaultFileSystemManager mgr = new DefaultFileSystemManager(); / SFTP 供应者 SftpFileProvider fp = new SftpFileProvider(); FileSystemOptions t = new FileSystemOptions(); / ZIP 供应者 ZipFileProvider zp = new ZipFileProvider(); / 缺省本地文件供应者 DefaultLocalFileProvider lf = new DefaultLocalFileProvider(); try / common-vfs 中 文件管理器的使用范例 mgr.addProvider(sftp, fp); mgr.addProvider(zip, zp); mgr.addProvider(file, lf); mgr.setFilesCache(new DefaultFilesCache(); mgr.init(); catch (FileSystemException e) / 此处应该改为log e.printStackTrace(); return mgr; void getWorkspaceFromProperties() /* * Properties tmpProperties; File tmpfile = new * File(perties); */ /* 138. * param args 139. * throws Exception 140. */ public static void main(String args) throws Exception AutoChecker op =new AutoChecker(); op.moveFile(C:/downloads, sftp:/odpuser:odpuser1:22/etc/services); VFSTest.javaimport java.io.IOException;import mons.vfs.FileContent;import mons.vfs.FileObject;import mons.vfs.FileSystemManager;import mons.vfs.FileType;import mons.vfs.VFS;public class VFSTest public static void main(String args) throws IOException FileSystemManager fsManager = VFS.getManager(); FileObject fo = fsManager.resolveFile(ftp:/ftpusername:ftppassword:21/dir/dir1/); FileObject children = fo.getChildren();/得到远程文件列表 for ( int i = 0; i children.length; i+ ) FileObject f = children i ; FileContent c = f.getContent(); File localFile = new File(f.getName().getBaseName(); FileOutputStream out = new FileOutputStream(localFile); mons.io.IOUtils.copy(c.getInputStream(), out);/写入本地/或使用写入 FileObject obj = fileSystemManager.resolveFile(this.getTargetResourceURL()+f.getName().getBaseName(); if(!obj.exists() obj.createFile(); obj.copyFrom(f, Selectors.SELECT_SELF); final long size = ( f.getType() = FileType.FILE ) ? c.getSize() : -1; final long date = ( f.getType() = FileType.FILE ) ? c.getLastModifiedTime() : -1; System.out.println( f.getName().getPath()+ date: + date + Size: + size ); 连接SFTPFileSystemManager fsManager = VFS.getManager(); FileSystemOptions opts = new FileSystemOptions(); SftpFileSystemConfigBuilder.getInstance().setStrictHostKeyChecking(opts, no); FileObject fo = fsManager.resolveFile(sftp:/ftpusername:ftppassword:21/dir/dir1/,opts ); FileObject children = fo.getChildren();/得到远程文件列表否则报错Caused by: java.lang.RuntimeException: mons.vfs.FileSystemException: Could not connect to SFTP server at sftp:/username:password:21/. at org.springframework.scheduling.quartz.QuartzJobBean.execute(Lorg.quartz.JobExecutionContext;)V(QuartzJobBean.java:66) at org.quartz.core.JobRunShell.run()V(JobRunShell.java:202) . 2 moreCaused by: mons.vfs.FileSystemException: Could not connect to SFTP server at sftp:/user:password:23/. at vider.sftp.SftpFileProvider.doCreateFileSystem(Lmons.vfs.FileName;Lmons.vfs.FileSystemOptions;)Lmons.vfs.FileSystem;(SftpFileProvider.java:99) at vider.AbstractOriginatingFileProvider.findFile(Lmons.vfs.FileName;Lmons.vfs.FileSystemOptions;)Lmons.vfs.FileObject;(AbstractOriginatingFileProvider.java:81) at vider.AbstractOriginatingFileProvider.findFile(Lmons.vfs.FileObject;Ljava.lang.String;Lmons.vfs.FileSystemOptions;)Lmons.vfs.FileObject;(AbstractOriginatingFileProvider.java:62) at mons.v

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论