`
aimer311
  • 浏览: 96432 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

使用jsch实现文件上传

    博客分类:
  • java
阅读更多

仅提供代码作为参考,

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 com.shonetown.common.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<String> filenames = new ArrayList<String>();
	
	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("os.name");
		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<String> 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; i<filenames.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 byte[1024];
				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文件的内容如下:

202.7.3.190 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEA6tHmMBQwcSieFneaObnDyzthMSn1FyWFp/TCMV4rt+ZEtOZo49GK0kdM3tYy1IQD8hZz016JG5uOIbrBN+O0BtzY89y3uIwo0hsYQtP/LKAR5BU+pT3R20ltVbcEGzrSpKiSClObD9MbiOt0899Du9bG89/BiMvxUxj/Rhg33l0=

 

 写道
附:产生此文件的简单方法:可以在Linux中用ssh命令登录一次,这样便在/root/.ssh(假如使用root用户登录到Linux)目录下生成known_hosts文件。

 这片文章也许对你更有帮助:http://www.blogjava.net/fastzch/archive/2008/07/08/213477.html

0
0
分享到:
评论
2 楼 MrCrapBag 2013-02-06  
/**
* 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
*
*/

这个类的说明很重要...

如果连接的时候报了com.jcraft.jsch.JSchException: Auth fail" 这样的错误,把/etc/ssh/sshd_config中的PasswordAuthentication 配置改成yes即可,即允许使用密码进行认证
1 楼 jn_nian 2012-03-22  
无法做到要上传的文件包含完整的路径,在各个浏览器里都不一样

相关推荐

    jsch实现sftp文件上传、下载 ,jsch jar

    JSCH(Java Secure Channel)是一个用Java实现的SSH2库,能够支持SFTP功能,包括文件的上传和下载。本篇文章将详细讲解如何利用JSCH库实现在Java程序中进行SFTP文件的上传与下载。 首先,我们需要在项目中引入JSCH...

    JSch - Java实现的SFTP(文件上传详解篇)

    JSch - Java实现的SFTP(文件上传详解篇)

    利用JSCH实现文件传输,JXL生成表格,log4简单使用

    在"利用JSCH实现文件传输"这一部分,你需要理解SSH协议的基础知识,包括身份验证、加密和会话管理。JSCH提供了API来创建连接、打开通道、执行SFTP操作等。例如,你可以创建一个`JSch`实例,设置用户信息,然后建立到...

    使用jsch中的ChannelSftp上传文件和文件夹[参考].pdf

    使用 JSCH 中的 ChannelSftp 上传文件和文件夹 JSCH(Java Secure Channel)是一款自由和开源的 Java 库,提供了安全的通信通道,包括 SSH、SFTP、SCP 等协议。 ChannelSftp 是 JSCH 中的一个实现 SFTP 协议的 ...

    使用jsch中的ChannelSftp上传文件和文件夹.pdf

    "使用JSch中的ChannelSftp上传文件和文件夹" 在Java开发中,上传文件和文件夹是一项常见的任务,例如在服务器上上传文件或文件夹。JSch库提供了一个名为ChannelSftp的类,可以用来上传文件和文件夹。本文将详细介绍...

    详解Java使用Jsch与sftp服务器实现ssh免密登录

    例如,put()用于文件上传,get()用于文件下载,cd()用于进入指定目录,ls()用于获取指定目录下的文件列表,rename()用于重命名文件等。利用这些方法,我们可以很方便地对远程服务器上的文件进行操作。 为了安全起见...

    使用jsch中的ChannelSftp上传文件和文件夹借鉴.pdf

    使用JSch库中的ChannelSftp可以实现文件和文件夹的上传功能。下面将详细介绍如何使用ChannelSftp实现文件和文件夹的上传。 ChannelSftp概述 ChannelSftp是JSch库中的一种Channel类型,用于实现SFTP(Secure File ...

    jsch实现远程传输

    使用SFTP通道进行文件上传或下载: ```java // 上传文件 File localFile = new File("local_path"); sftpChannel.cd("remote_directory"); // 进入远程目录 sftpChannel.put(localFile.getAbsolutePath(), local...

    jsch.jar及实现代码 SftpUtil.java java使用sftp实现上传下载文件

    4. **文件上传**:在SFTP通道上,可以获取`ChannelSftp`对象,然后调用它的`put()`方法来上传本地文件到远程服务器。需要指定源文件路径和目标文件路径。 5. **文件下载**:类似地,使用`ChannelSftp.get()`方法...

    java使用JSCH实现SFTP文件管理

    Java使用JSCH库实现SFTP文件管理是一种常见的远程文件传输方式,特别适用于需要与服务器进行交互,例如上传、下载文件的场景。JSCH(Java Secure Channel)是一个纯Java实现的SSH2库,允许用户通过SSH协议连接到远程...

    FTP文件上传下载删除+jsch.jar

    在这个主题中,我们将深入探讨如何使用JSCH库来实现FTP的文件上传、下载和删除功能。 JSCH是一个纯Java实现的SSH2库,它允许Java程序执行SCP(Secure Copy)、SFTP(Secure File Transfer Protocol)和FTP通过SSH...

    jsch文件名中文乱码解决办法

    感谢你的下载,文件说明如下: *jsch的源文件 *jsch的依赖包 *用jsch源文件及依赖包构建的项目,便于修改其源码* 修改源码后重新导出的jar包 *我写的一段小程序,实现的主要功能是同步sftp上的文件夹(sftp-&gt;本地) ...

    JSch对linux上文件的操作

    **文件上传**: 在SFTP通道建立后,我们可以使用`ChannelSftp.put()`方法上传文件到远程服务器。这个方法接受源文件路径和目标远程路径作为参数: ```java File localFile = new File("/local/path/to/file.txt"); ...

    java使用JSCH进行连接远程服务器Demo

    Java使用JSCH(Java Secure Channel)库连接远程服务器是一个常见的任务,特别是在自动化运维、文件传输或者执行远程命令等场景中。JSCH是一个纯Java实现的SSH2库,它提供了连接到支持SSH协议的服务器的能力,如...

    Java版的并行分布式SSH客户端,基于jsch实现。可并行或串行在多台服务器上执行指令,上传或下载文件。.zip

    在实现文件上传和下载功能时,JSch的`ChannelSftp`类非常有用。通过创建`ChannelSftp`实例,我们可以打开一个SFTP通道,然后调用`cd`、`put`、`get`等方法来改变目录、上传文件和下载文件。这些操作都支持文件和目录...

    com.jcraft.jsch

    4. **执行操作**:通过已创建的通道,可以执行远程命令、上传/下载文件,或者实现本地到远程、远程到本地、本地到本地的端口转发。 在实际应用中,使用jsch库进行SSH连接的一般步骤如下: 1. 加载jsch库,并实例化...

    jsch-0.1.42.jar及用java实现SFTP的例子

    要使用JSch实现SFTP,你需要遵循以下步骤: 1. **导入JSch库**:在项目中添加jsch-0.1.42.jar依赖。 2. **创建Session**:使用`JSch`类的`getSession()`方法,传入用户名、主机名、端口号和密码(或私钥)。 3. *...

Global site tag (gtag.js) - Google Analytics