`

sftp工具类【附代码DEMO】

阅读更多

sftp协议介绍

sftp是Secure File Transfer Protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的加密方法。sftp 与 ftp 有着几乎一样的语法和功能。SFTP 为 SSH的一部分,是一种传输档案至 Blogger 伺服器的安全方式。其实在SSH软件包中,已经包含了一个叫作SFTP(Secure File Transfer Protocol)的安全文件传输子系统,SFTP本身没有单独的守护进程,它必须使用sshd守护进程(端口号默认是22)来完成相应的连接操作,所以从某种意义上来说,SFTP并不像一个服务器程序,而更像是一个客户端程序。SFTP同样是使用加密传输认证信息和传输的数据,所以,使用SFTP是非常安全的。但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多,如果您对网络安全性要求更高时,可以使用SFTP代替FTP。

 

代码demo

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.util.Vector;

import org.apache.commons.lang3.StringUtils;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;

/**
 * sftp工具类
 * 
 * @author cuigh
 *
 */
public class SftpUtils {

	public static void main(String[] args) {
		SftpUtils .upload("/usr/temp/", "d:\\temp\\bak.txt", NginSftpUtils.connect());
	}

	/**
	 * 默认连接sftp服务器
	 * 
	 * @return ChannelSftp
	 */
	public static ChannelSftp connect() {
		String host = BasePropertiesUtils.getValue("nginf.sftp.ip");
		int port = Integer.parseInt(BasePropertiesUtils.getValue("nginf.sftp.port"));
		String username = BasePropertiesUtils.getValue("nginf.sftp.username");
		String password = BasePropertiesUtils.getValue("nginf.sftp.password");
		return connect(host, port, username, password);
	}

	/**
	 * 连接sftp服务器
	 * 
	 * @param host
	 *            主机
	 * @param port
	 *            端口
	 * @param username
	 *            用户名
	 * @param password
	 *            密码
	 * @return
	 */
	public static ChannelSftp connect(String host, int port, String username,
			String password) {
		ChannelSftp sftp = null;
		try {
			JSch jsch = new JSch();
			jsch.getSession(username, host, port);
			Session sshSession = jsch.getSession(username, host, port);
			System.out.println("Session created.");
			sshSession.setPassword(password);
			Properties sshConfig = new Properties();
			sshConfig.put("StrictHostKeyChecking", "no");
			sshSession.setConfig(sshConfig);
			sshSession.connect();
			System.out.println("Session connected.");
			System.out.println("Opening Channel.");
			Channel channel = sshSession.openChannel("sftp");
			channel.connect();
			sftp = (ChannelSftp) channel;
			System.out.println("Connected to " + host + ".");
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
		return sftp;
	}

	/**
	 * 上传文件
	 * 
	 * @param directory
	 *            上传的目录
	 * @param uploadFile
	 *            要上传的文件
	 * @param sftp
	 */
	public static void upload(String directory, String uploadFile,
			ChannelSftp sftp) {
			/*sftp.cd(directory);
			sftp.cd(dest);
			sftp.mkdir(dest);
			File file = new File(uploadFile);
			sftp.put(new FileInputStream(file), file.getName());*/
			mkDir(directory, sftp);
			InputStream in = null;
			try {
				sftp.cd(directory);
				File file = new File(uploadFile);
				in  = new FileInputStream(file);
				sftp.put(new FileInputStream(file), file.getName());
			} catch (SftpException | FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} finally{
			    try {
                    in.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
			}
	}

	/**
	 * 下载文件
	 * 
	 * @param directory
	 *            下载目录
	 * @param downloadFile
	 *            下载的文件
	 * @param saveFile
	 *            存在本地的路径
	 * @param sftp
	 */
	public static void download(String directory, String downloadFile,
			String saveFile, ChannelSftp sftp) {
		try {
			sftp.cd(directory);
			File file = new File(saveFile);
			sftp.get(downloadFile, new FileOutputStream(file));
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}

	/**
	 * 删除文件
	 * 
	 * @param directory
	 *            要删除文件所在目录
	 * @param deleteFile
	 *            要删除的文件
	 * @param sftp
	 */
	public static void delete(String directory, String deleteFile,
			ChannelSftp sftp) {
		try {
			sftp.cd(directory);
			sftp.rm(deleteFile);
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}

	/**
	 * 列出目录下的文件
	 * 
	 * @param directory
	 *            要列出的目录
	 * @param sftp
	 * @return
	 * @throws SftpException
	 */
	public static Vector listFiles(String directory, ChannelSftp sftp)
			throws SftpException {
		return sftp.ls(directory);
	}
	
	 /** 
     * 打开指定目录 
     * 
     * @param directory 
     *            directory 
     * @return 是否打开目录 
     */ 
    public static boolean openDir(String directory,ChannelSftp sftp) 
    { 
        try 
        { 
            sftp.cd(directory); 
            return true; 
        } 
        catch (SftpException e) 
        { 
            return false; 
        } 
    } 
    
    /** 
     * 创建指定文件夹 
     * 
     * @param dirName 
     *            dirName 
     */ 
    public static void mkDir(String dirName,ChannelSftp sftp) 
    { 
        String[] dirs = dirName.split("/"); 
        
        try 
        { 
            String now = sftp.pwd(); 
            sftp.cd("/");
            for (int i = 0; i < dirs.length; i++) 
            { 
            	if (StringUtils.isNotEmpty(dirs[i])) {
            		 boolean dirExists = openDir(dirs[i],sftp); 
                     if (!dirExists) 
                     { 
                         sftp.mkdir(dirs[i]); 
                         sftp.cd(dirs[i]); 
                     } 
				}
            } 
            sftp.cd(now); 
        } 
        catch (SftpException e) 
        { 
        	e.printStackTrace();
        } 
    } 

}

 

分享到:
评论

相关推荐

    C#实现SFTP文件上传和下载,有进度条

    总的来说,C#和Renci.SshNet为开发人员提供了一个强大且灵活的工具集,用于处理SFTP文件操作,同时可以通过回调机制轻松地实现进度监控,提升用户体验。在你的SFTPtest工程中,你可以找到一个完整的示例,包含了编译...

    springboot-FtpUtil-master_springbootftputil_ftp_attentioniwd_DEM

    这个DEMO提供了一个实用的FTP工具类,非常适合开发者进行学习和参考。 首先,SpringBoot是一个由Pivotal团队提供的开源框架,它简化了在Java环境中创建生产级的基于Spring的应用程序的过程。通过自动配置和“起步...

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

    基于EJB的真实世界模型,附源代码,部分功能需JSP配合完成。 J2ME优化压缩PNG文件 4个目标文件 内容索引:JAVA源码,综合应用,J2me游戏,PNG,图形处理 这是个J2ME控制台程序,它能剔除PNG文件中的非关键数据段,减少...

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

    基于EJB的真实世界模型,附源代码,部分功能需JSP配合完成。 J2ME优化压缩PNG文件 4个目标文件 内容索引:JAVA源码,综合应用,J2me游戏,PNG,图形处理 这是个J2ME控制台程序,它能剔除PNG文件中的非关键数据段,减少...

    C#远程备份、单机备份自写Demo

    在“C#远程备份、单机备份自写Demo”项目中,开发者可能已经实现了上述功能,并通过一个简洁的用户界面或命令行工具提供给客户使用。文件列表中的“远程备份”可能是指项目中包含的示例代码或配置文件,用于演示如何...

    SSH_Demo案例

    此外,可能还有对应的Java源代码,包括Action类(Struts)、Service类(业务逻辑)和DAO(数据访问对象)类(用于与数据库交互)。这些文件共同构成了一个完整的SSH应用实例,可以帮助初学者理解如何在实际项目中...

    C#开发的一个远程工具

    1. Socket编程:C#中的System.Net.Sockets命名空间提供了Socket类,用于实现TCP/IP或UDP通信,是构建远程工具的基础。 2. TCP/UDP协议:TCP提供可靠的数据传输,适用于需要保证数据完整性的场景;UDP则更轻量级,...

    ssh整合demo

    标签中的"源码"可能指的是这个示例提供了具体的代码实现,而"工具"可能指的是JSch这样的库作为整合SSH服务的工具。 在实际项目中,SSH整合可能会更复杂,比如涉及到文件传输(SFTP)、端口转发、隧道建立等高级功能...

    SharpSSH Demo

    例如,通过SharpSSH,我们可以编写C#代码来执行远程服务器的备份脚本,然后将备份文件通过SFTP上传到另一个安全的位置。 此外,SharpSSH还支持SSH公钥认证,这为无密码登录提供了可能,增强了安全性。用户可以生成...

    pb12.5的FTP源码(Demo内含pb9的pbl).zip

    PBL是PowerBuilder库文件的扩展名,其中包含了对象、类、函数和其他可重用的代码组件。 FTP(File Transfer Protocol)则是一种用于在网络上进行文件传输的标准协议。它允许用户从一个远程服务器上传或下载文件,...

    QSshLibAndDemo.zip

    3. **SFTP(Secure File Transfer Protocol)**:QSsh还提供了SFTP服务,允许用户安全地在本地和远程主机之间传输文件。这包括文件的上传、下载、重命名、删除等操作。 4. **事件驱动模型**:QSsh基于Qt的异步事件...

    ftp客户端,QT4.8.6实现

    为了深入理解这个FTP客户端的实现,你需要阅读和分析源代码,了解每个类和函数的作用,以及它们如何协同工作。此外,理解QT的信号和槽机制也很关键,因为这是QT中事件驱动编程的基础。最后,熟悉FTP协议的细节将有助...

    C#通过ssh调用linux终端及文件上传

    在C#程序中,你可以通过Process类调用Plink命令,从而实现与Linux系统的通信。例如,你可以创建一个新的Process实例,设置其StartInfo属性,包括Plink的路径、目标主机、用户名和密码,然后启动进程执行远程命令。 ...

    SSH2环境搭建Jar包

    这些库提供了实现SSH2连接、文件传输、隧道建立等功能的类和方法。 1. 获取SSH2库: - JSch:一个流行的Java SSH2实现,可以在官方网站(https://www.jcraft.com/jsch/)下载最新版本的JSch库。它提供了丰富的API,...

    C#的各类插件的编写,用于发送到文件服务器使用

    在"设备扳手采集demo及插件"这个项目中,我们可以理解为这是一个用于数据采集的工具,其可能包含了C#编写的各种插件,用于连接不同的硬件设备,如传感器或者控制器,进行数据的读取和处理。在与前端交互时,这些插件...

    testftp.zip

    描述中提到,这是一个“ftp上传测试demojava代码”,这意味着我们将会看到一个Java程序,该程序包含了FTP客户端的实现,用于连接到FTP服务器进行文件操作。"idea的springboot项目"提示我们,开发环境是JetBrains的...

    Java 实现实时监听文件夹是否有新文件增加并上传服务器功能

    Timer类可以用来安排一个任务(使用TimerTask抽象类实现)在将来的某个时间执行一次,或定期重复执行。它适用于那些需要周期性执行或延时执行的任务。在本文的案例中,Timer用于初始化文件夹监听任务,TimerTask则...

    python下paramiko模块实现ssh连接登录Linux服务器

    在Python编程环境中,当需要与Linux服务器进行交互,如执行远程命令、文件传输等操作时,Paramiko模块是一个非常实用的工具。Paramiko是一个纯Python实现的SSHv2协议库,支持加密和认证机制,包括公钥、私钥以及密码...

    网络数据加载

    Volley是一个高效的网络库,适合处理小量、快速的网络请求,它内置了图片加载优化和请求队列管理,适合新闻、社交类应用。 对于大文件的下载,Android提供DownloadManager服务,可以处理后台下载、断点续传等功能。...

    ftp需要的jar 包

    FTP(File Transfer Protocol)是一种广泛使用的网络协议,用于在计算机之间传输文件。...同时,注意FTP的安全问题,尽量使用FTPS(FTP over SSL/TLS)或SFTP(SSH File Transfer Protocol)来提高数据传输的安全性。

Global site tag (gtag.js) - Google Analytics