`
krs
  • 浏览: 128595 次
  • 性别: 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

分享到:
评论

相关推荐

    Java读取远程主机文件

    总之,Java通过SSH连接远程主机并读取文件是通过第三方库实现的,`ganymed-ssh2`提供了强大的功能和灵活性。理解和掌握这些技术对于开发涉及远程文件操作的应用至关重要。在实际开发中,需要结合具体需求,灵活运用...

    java远程telnet ftp和ssh连接的方法

    Telnet是一种协议,允许用户通过网络在远程主机上执行命令。在Java中,我们可以使用`java.net.Socket`类来建立TCP连接,然后通过输入/输出流来发送和接收数据。以下是一个简单的Telnet连接示例: ```java import...

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

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

    java SSH FTP下载文件

    本篇文章将深入探讨如何使用Java通过SSH和FTP协议来实现从服务器下载文件到本地的操作。 首先,对于SSH连接,Java中通常使用JSch库。JSch是一个纯Java实现的SSH2库,它可以让你连接到一个SSH服务器,执行命令,以及...

    SSH2 java连接远程服务器框架

    SSH(Secure Shell)是一种网络协议,用于在不安全的...通过以上步骤,你可以使用Java的SSH2框架(如JSch)连接到远程服务器,执行命令和传输文件。这在自动化运维、远程脚本执行、文件同步等多个场景中都非常实用。

    java远程连接ssh

    在IT行业中,Java远程连接SSH是一项重要的技能,特别是在管理和维护基于Linux系统的服务器时。SSH(Secure Shell)是一种网络协议,用于安全地远程控制操作系统,执行命令,传输数据。本篇文章将详细探讨Java如何...

    ssh上传下载

    Java SSH框架,如JSch或Apache MINA,允许开发者在Java应用中实现SSH功能,包括文件的上传和下载。这里我们将深入探讨如何使用这些框架进行SSH文件传输,以及涉及的相关知识点。 首先,SSH框架在Java中的应用主要...

    ssh文件上传下载

    在这个场景中,"ssh文件上传下载"指的是通过SSH协议在本地计算机和远程服务器之间进行文件的传输。 1. **SSH基础** SSH是Secure Shell的缩写,由IETF的网络工作小组制定。它为网络服务提供了安全的加密通信渠道,...

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

    SFTP(SSH File Transfer Protocol)是一种安全文件传输协议,它为文件传输提供了安全加密的方式。与传统FTP协议相比,SFTP能够对认证信息和传输数据进行加密处理,从而保障数据传输过程的安全性。由于采用了加密/...

    7.linux远程连接工具类 SSH

    Linux远程连接工具类SSH是一种广泛使用的通信协议,它允许用户在本地计算机上安全地操作远程Linux系统。SSH,全称为Secure Shell,旨在提供加密的网络服务,特别适用于管理服务器、执行命令、传输文件等场景。在开发...

    SSH连接远程服务器的一个简单的工程

    在Java开发中,SSH通常指的是使用Java实现的SSH连接库,如JSch,它允许程序员通过Java代码来实现SSH连接到远程服务器,进行文件传输、命令执行等操作。 本工程名为"SSH连接远程服务器的一个简单的工程",它提供了...

    java进行ssh协议连接的jar包jsch-0.1.54.jar

    SSH(Secure Shell)协议是一种网络协议,用于在不安全的网络上安全地远程访问和管理服务器。Java中的JSCH库(JSch)是实现SSH连接的开源库,它提供了全面的功能,包括SFTP(SSH File Transfer Protocol)、SCP...

    java linux ssh登陆

    这里,我们将会详细探讨Java如何通过SSH连接到Linux系统以及相关的关键概念和技术。 首先,SSH是一种网络协议,用于在不安全的网络上提供安全的远程登录和其他服务。它通过加密来保护数据传输,防止中间人攻击。在...

    SSH连接数据库所需jar

    在这个场景中,"SSH连接数据库所需jar"指的是使用Java编程语言通过SSH隧道连接到数据库所需的Java类库(JAR文件)。 SSH连接数据库的方式通常是通过建立一个SSH隧道,将本地端口映射到远程服务器上的某个端口,从而...

    java连接服务器,对服务器命令操作,文件上传和文件下载工具

    本篇文章将深入探讨如何使用Java连接服务器,执行命令,进行文件上传和下载,并结合Sigar库来获取系统信息。 一、Java连接服务器与执行命令 在Java中,我们可以使用JSch库来实现SSH(Secure Shell)连接,从而远程...

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

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

    SSH2连接Oracle数据库的例子

    5. **SSH连接设置**:除了数据库连接信息,还需要SSH的凭据,包括SSH服务器的主机名、端口、用户名和私钥文件(如果使用公钥认证)。 6. **代码实现**:在Java程序中,使用JSch库创建SSH隧道,然后通过隧道建立到...

    SSH文件上传与下载

    SSH(Secure Shell)是一种网络协议,用于在不安全的网络上提供安全的远程登录和其他服务。在IT领域,SSH常用于文件的传输,包括上传和下载。...通过学习和实践,我们可以更加熟练地使用SSH进行文件的上传和下载。

    基于Java和ssh在Hadoop平台上完成文件操作

    在IT领域,尤其是在大数据处理和分布式计算中,Java和SSH(Secure Shell)是两种非常重要的技术。...开发者可以通过Java API直接操作HDFS,利用SSH进行远程管理和监控,实现高效且安全的文件操作和结果查询。

    java_ssh执行命令

    - **文件传输**:使用SFTP(SSH File Transfer Protocol)进行文件的上传和下载。 - **多命令脚本**:通过SSH执行一系列命令,可能需要自定义命令的分隔符和逻辑。 - **错误处理**:处理网络中断、权限问题或其他...

Global site tag (gtag.js) - Google Analytics