`
krs
  • 浏览: 124725 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

[转] java 通过SSH方式连接远程主机并上传和下载文件

    博客分类:
  • Java
阅读更多

 Java连接远程主机的方式有多种,这里和大家分享的是通过ssh方式连接远程主机,使用的是jsch这个jar包,资源在这里。

    不懂ssh为何物的朋友可以从网上找找相关资料,这里只简单的解释下:SSH 为 Secure Shell(安全外壳协议) 的缩写,由 IETF 的网络工作小组(Network Working Group)所制定,为建立在应用层和传输层基础上的安全协议。SSH在传输层提供服务器认证,数据机密性,信息完整性等的支持,并为服务器提供客户端的身份鉴别。利用SSH协议可以有效防止远程管理过程中的信息泄露问题。通过SSH可以对所有传输的数据进行加密,也能够防止DNS欺骗和IP欺骗。

    下面是自己写的一个sftp帮助类,代码中有错误或者是不合理完善的地方希望能够指出,共同学习成长:

package com.app.pt.backup.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.Iterator;
import java.util.Vector;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.app.common.util.FileUtil;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.ChannelSftp.LsEntry;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;

/**
 * SFTP帮助类
 * @author wangbailin
 *
 */
public class SFTPUtil {
	
	private static Log log = LogFactory.getLog(SFTPUtil.class);
	
	/**
	 * 连接sftp服务器
	 * @param host 远程主机ip地址
	 * @param port sftp连接端口,null 时为默认端口
	 * @param user 用户名
	 * @param password 密码
	 * @return
	 * @throws JSchException 
	 */
	public static Session connect(String host, Integer port, String user, String password) throws JSchException{
		Session session = null;
		try {
			JSch jsch = new JSch();
			if(port != null){
				session = jsch.getSession(user, host, port.intValue());
			}else{
				session = jsch.getSession(user, host);
			}
			session.setPassword(password);
			//设置第一次登陆的时候提示,可选值:(ask | yes | no)
			session.setConfig("StrictHostKeyChecking", "no");
			//30秒连接超时
			session.connect(30000);
		} catch (JSchException e) {
			e.printStackTrace();
			System.out.println("SFTPUitl 获取连接发生错误");
			throw e;
		}
		return session;
	}
	
	/**
	 * sftp上传文件(夹)
	 * @param directory
	 * @param uploadFile
	 * @param sftp
	 * @throws Exception 
	 */
	public static void upload(String directory, String uploadFile, ChannelSftp sftp) throws Exception{
		System.out.println("sftp upload file [directory] : "+directory);
		System.out.println("sftp upload file [uploadFile] : "+ uploadFile);
		File file = new File(uploadFile);
		if(file.exists()){
			//这里有点投机取巧,因为ChannelSftp无法去判读远程linux主机的文件路径,无奈之举
			try {
				Vector content = sftp.ls(directory);
				if(content == null){
					sftp.mkdir(directory);
				}
			} catch (SftpException e) {
				sftp.mkdir(directory);
			}
			//进入目标路径
			sftp.cd(directory);
			if(file.isFile()){
				InputStream ins = new FileInputStream(file);
				//中文名称的
				sftp.put(ins, new String(file.getName().getBytes(),"UTF-8"));
				//sftp.setFilenameEncoding("UTF-8");
			}else{
				File[] files = file.listFiles();
				for (File file2 : files) {
					String dir = file2.getAbsolutePath();
					if(file2.isDirectory()){
						String str = dir.substring(dir.lastIndexOf(file2.separator));
						directory = FileUtil.normalize(directory + str);
					}
					upload(directory,dir,sftp);
				}
			}
		}
	}
	
	/**
	 * sftp下载文件(夹)
	 * @param directory 下载文件上级目录
	 * @param srcFile 下载文件完全路径
	 * @param saveFile 保存文件路径
	 * @param sftp ChannelSftp
	 * @throws UnsupportedEncodingException
	 */
	public static void download(String directory,String srcFile, String saveFile, ChannelSftp sftp) throws UnsupportedEncodingException {
		Vector conts = null;
		try{
			conts = sftp.ls(srcFile);
		} catch (SftpException e) {
			e.printStackTrace();
			log.debug("ChannelSftp sftp罗列文件发生错误",e);
		}
		File file = new File(saveFile);
		if(!file.exists()) file.mkdir();
		//文件
		if(srcFile.indexOf(".") > -1){
			try {
				sftp.get(srcFile, saveFile);
			} catch (SftpException e) {
				e.printStackTrace();
				log.debug("ChannelSftp sftp下载文件发生错误",e);
			}
		}else{
		//文件夹(路径)
			for (Iterator iterator = conts.iterator(); iterator.hasNext();) {
				LsEntry obj =  (LsEntry) iterator.next();
				String filename = new String(obj.getFilename().getBytes(),"UTF-8");
				if(!(filename.indexOf(".") > -1)){
					directory = FileUtil.normalize(directory + System.getProperty("file.separator") + filename);
					srcFile = directory;
					saveFile = FileUtil.normalize(saveFile + System.getProperty("file.separator") + filename);
				}else{
					//扫描到文件名为".."这样的直接跳过
					String[] arrs = filename.split("\\.");
					if((arrs.length > 0) && (arrs[0].length() > 0)){
						srcFile = FileUtil.normalize(directory + System.getProperty("file.separator") + filename);
					}else{
						continue;
					}
				}
				download(directory, srcFile, saveFile, sftp);
			}
		}
	}
}

  使用sftp帮助类上传或下载:

ChannelSftp sftp = null;
Session session = null;
try {
	session = SFTPUtil.connect(host, port, username, password);
	Channel channel = session.openChannel("sftp");
	channel.connect();
	sftp = (ChannelSftp) channel;
	SFTPUtil.upload(destDir, srcfile.getAbsolutePath(), sftp);
} catch (Exception e) {
	e.printStackTrace();
	logger.debug(e);
	return UtilMisc.toMap("flag","failure","msg","备份文件到远程主机发生错误");
}finally{
	if(sftp != null)sftp.disconnect();
	if(session != null)session.disconnect();
}

 (转自:http://blog.csdn.net/wangbailin2009/article/details/20232999

分享到:
评论

相关推荐

    jsch源代码_通过java代码ssh登录主机远程执行命令并返回

    jsch通过java代码ssh登录主机远程执行命令并返回结果。注意,这个是源代码,请自行编译后在使用。当然,也可以根据自己的需要更改源代码。

    ganymed-ssh2-build210.jar java远程访问linux服务器操作、上传下载文件

    远程执行shll脚本或者命令、上传下载文件 package com.szkingdom.kfit.bank.ccbDirectShortcut.helper; import ch.ethz.ssh2.Connection; import ch.ethz.ssh2.SCPClient; import ch.ethz.ssh2.Session; import ...

    基于Java的远程主机批量执行SSH命令设计源码

    这是一个基于Java的远程主机批量执行SSH命令的设计,使用Java语言开发,包含35个文件。主要文件类型包括24个Java源文件、3个XML文件、2个Properties文件、1个gitignore文件、1个LICENSE文件、1个BAT批处理文件、1个...

    JAVA上百实例源码以及开源项目

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

    java源码包---java 源码 大量 实例

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

    java源码包4

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

    ganymed-ssh2-build210

    Java 在用 ssh 协议远程在 linux 目标主机上执行命令的架包

    JAVA上百实例源码以及开源项目源代码

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

    java图像压缩源码-scala-ssh:通过SSH为Scala应用程序进行远程shell访问

    通过配置文件、资源或直接在代码中方便地配置远程主机属性 Scala 惯用 API 安装 最新版本是0.11.1 ,是针对 Scala 2.12、2.13和 3 构建的。它可以从 Maven Central 获得。 如果您使用,您可以使用以下命令拉入scala-...

    java源码包3

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

    java源码包2

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户可以在终端上...

    Java实现windows下远程调用shell脚本

    该工具是基于SSH2协议的实现,在使用它的过程中非常容易,只需要指定合法的用户名口令,或者授权认证文件,就可以创建到远程Linux主机的连接,在建立起来的会话中调用该Linux主机上的脚本文件,执行相关操作。

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户可以在终端上...

    远程连接工具——putty

    远程通讯工具,加密连接,常用来连接远程主机 我的虚拟机就用这个

    Xshell-Linux远程登录-免费的服务器连接工具 (永久使用版)

    Xshell 通过互联网到远程主机的安全连接以及它创新性的设计和特色帮助用户在复杂的网络环境中享受他们的工作。 Xshell可以在Windows界面下用来访问远端不同系统下的服务器,从而比较好的达到远程控制终端的目的。除...

    Linux服务器批处理远程命令执行工具

    Linux服务器批处理远程命令执行工具。纯java实现的ssh协议(jsch),支持同时连接多台linux主机,执行相同的命令。...并发远程主机主机连接,顺序返回执行结果。并发命令执行,可配置顺序或随机(阻塞)返回执行结果

    跨平台远程控制软件 TightVNC 2.8.27 + x64.zip

    其中显着增强的功能项目有文件传输和支持 Windows DFMirage 镜像驱动软体应用程序以用于检测显示器屏幕更新,节省下 CPU 时间和增加的此应用软件 TightVNC 的性能表现,与能够放大缩小影像图像和在Unix的自动SSH隧道...

Global site tag (gtag.js) - Google Analytics