`
xurichusheng
  • 浏览: 344796 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

使用sftp操作远程Linux文件

    博客分类:
  • sftp
阅读更多

 

jar 包:

     jsch-0.1.52.jar

    http://central.maven.org/maven2/com/jcraft/jsch/0.1.52/jsch-0.1.52.jar

 

     junit-4.10.jar

     http://central.maven.org/maven2/junit/junit/4.10/junit-4.10.jar

 

     slf4j-api-1.4.3.jar 、 slf4j-log4j12-1.4.0.jar、 log4j-1.2.17.jar

 

SftpUtils.java

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

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

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;

/**
 * @ClassName: SftpUtils
 * @Description: 使用sftp操作远程Linux文件
 * @author 
 * @company 
 * @date 2015年11月12日
 * @version V1.0
 */

public final class SftpUtils {

	private static final Logger log = LoggerFactory.getLogger(SftpUtils.class);

	private volatile static SftpUtils instance;

	private SftpUtils() {
	}

	/** 单例模式获取对象SftpUtils的实例 */
	public static SftpUtils getInstance() {

		if (null == instance) {
			synchronized (SftpUtils.class) {
				if (null == instance) {
					instance = new SftpUtils();
				}
			}
		}

		return instance;
	}

	/** ssh会话 */
	private volatile Session sshSession = null;

	/**
	 * 连接sftp服务器
	 * 
	 * @param host
	 *            主机
	 * @param port
	 *            端口
	 * @param username
	 *            用户名
	 * @param password
	 *            密码
	 * @return ChannelSftp
	 */
	public ChannelSftp connect(String host, int port, String username,
			String password) throws Exception {

		log.info("SftpUtils.connect(...),host=" + host);
		log.info("SftpUtils.connect(...),port=" + port);
		log.info("SftpUtils.connect(...),username=" + username);
		log.info("SftpUtils.connect(...),password=" + password);

		ChannelSftp sftp = null;
		Channel channel = null;

		try {
			JSch jsch = new JSch();

			jsch.getSession(username, host, port);

			sshSession = jsch.getSession(username, host, port);

			log.info("Session created.");

			sshSession.setPassword(password);

			Properties sshConfig = new Properties();

			sshConfig.put("StrictHostKeyChecking", "no");

			sshSession.setConfig(sshConfig);

			sshSession.connect();

			log.info("Session connected.");

			channel = sshSession.openChannel("sftp");

			channel.connect();

			sftp = (ChannelSftp) channel;

			log.info("Connected to " + host + " success.");
		} catch (JSchException e) {
			log.error("Connect to '" + host + "' fail:" + e.getMessage(), e);
		} catch (Exception e) {
			log.error("Connect to '" + host + "' fail:" + e.getMessage(), e);
		}

		return sftp;
	}

	/**
	 * 上传文件
	 * 
	 * @param ip
	 *            远程服务器ip
	 * @param port
	 *            远程服务器sftp端口号
	 * @param userName
	 *            远程服务器登录名
	 * @param password
	 *            远程服务器登录密码
	 * @param directory
	 *            上传到服务器哪个目录
	 * @param uploadFile
	 *            要上传的本地文件
	 * @param sftp
	 */
	public void upload(String ip, int port, String userName, String password,
			String directory, String uploadFile) throws Exception {

		log.info("Into SftpUtils.upload(...)");

		log.info("SftpUtils.upload(...),directory=" + directory);
		log.info("SftpUtils.upload(...),uploadFile=" + uploadFile);

		FileInputStream is = null;
		ChannelSftp sftp = null;

		try {
			sftp = this.connect(ip, port, userName, password);

			sftp.cd(directory);

			File file = new File(uploadFile);

			is = new FileInputStream(file);

			sftp.put(is, file.getName());

			log.info("sftp Upload file '" + uploadFile + "' success.");

		} catch (FileNotFoundException e) {
			log.error("file '" + uploadFile + "' not found!", e);
			throw e;
		} catch (Exception e) {
			log.error("upload file '" + uploadFile + "' fail:" + e.getMessage(),
					e);
			throw e;
		} finally {
			log.info("End of SftpUtils.upload(...)");

			IOUtils.closeStream(is, null);
			this.disconnectSftp(sftp);
			this.disconnectSession(sshSession);
		}
	}

	/**
	 * 下载文件
	 * 
	 * @param ip
	 *            远程服务器ip
	 * @param port
	 *            远程服务器sftp端口号
	 * @param userName
	 *            远程服务器登录名
	 * @param password
	 *            远程服务器登录密码
	 * @param directory
	 *            下载目录
	 * @param downloadFile
	 *            下载的文件名
	 * @param saveFile
	 *            存在本地的路径
	 */
	public void download(String ip, int port, String userName, String password,
			String directory, String downloadFile, String saveFile)
					throws Exception {

		log.info("Into SftpUtils.download(...)");

		log.info("SftpUtils.download(...),directory=" + directory);
		log.info("SftpUtils.download(...),downloadFile=" + downloadFile);
		log.info("SftpUtils.download(...),saveFile=" + saveFile);

		FileOutputStream os = null;
		ChannelSftp sftp = null;

		try {
			sftp = this.connect(ip, port, userName, password);

			sftp.cd(directory);

			File file = new File(saveFile);

			os = new FileOutputStream(file);

			sftp.get(downloadFile, os);

			log.info("sftp download file '" + downloadFile + "' success.");

		} catch (FileNotFoundException e) {
			log.error("file '" + downloadFile + "' not found!", e);
			throw e;
		} catch (Exception e) {
			log.error("download file '" + downloadFile + "' fail:"
					+ e.getMessage(), e);
			throw e;
		} finally {
			log.info("End of SftpUtils.download(...)");

			IOUtils.closeStream(null, os);
			this.disconnectSftp(sftp);
			this.disconnectSession(sshSession);
		}
	}

	/**
	 * 删除文件
	 * 
	 * @param ip
	 *            远程服务器ip
	 * @param port
	 *            远程服务器sftp端口号
	 * @param userName
	 *            远程服务器登录名
	 * @param password
	 *            远程服务器登录密码
	 * @param directory
	 *            要删除文件所在目录
	 * @param deleteFile
	 *            要删除的文件
	 * @param sftp
	 */
	public void delete(String ip, int port, String userName, String password,
			String directory, String deleteFile) throws Exception {

		ChannelSftp sftp = null;

		try {
			sftp = this.connect(ip, port, userName, password);

			sftp.cd(directory);

			sftp.rm(deleteFile);

		} catch (Exception e) {
			log.error("Delete file '" + deleteFile + "' fail:" + e.getMessage(),
					e);
			throw e;
		} finally {
			this.disconnectSftp(sftp);
			this.disconnectSession(sshSession);
		}
	}

	/**
	 * 列出目录下的文件
	 * 
	 * @param directory
	 *            要列出的目录
	 * @param sftp
	 * @return Vector
	 * @throws SftpException
	 */
	@SuppressWarnings({ "rawtypes" })
	public Vector listFiles(String ip, int port, String userName,
			String password, String directory) throws Exception {

		ChannelSftp sftp = null;

		Vector v = null;

		try {
			sftp = this.connect(ip, port, userName, password);

			v = sftp.ls(directory);

		} catch (Exception e) {
			log.error("List all files of '" + directory + "' fail:"
					+ e.getMessage(), e);
			throw e;
		} finally {
			this.disconnectSftp(sftp);
			this.disconnectSession(sshSession);
		}

		return v;
	}

	public void disconnectSftp(ChannelSftp sftp) {

		if (null != sftp && sftp.isConnected()) {

			log.info("Disconnect ChannelSftp.");

			sftp.disconnect();
			sftp.exit();

			sftp = null;
		}
	}

	public void disconnectSession(Session sshSession) {

		if (null != sshSession && sshSession.isConnected()) {

			log.info("Disconnect Session.");

			sshSession.disconnect();

			sshSession = null;
		}
	}

	public void disconnectChannel(Channel channel) {

		if (null != channel && channel.isConnected()) {

			log.info("Disconnect Channel.");

			channel.disconnect();

			channel = null;
		}
	}
}

 

 

测试类(使用 junit 4)

import static org.junit.Assert.fail;

import java.util.Iterator;
import java.util.Vector;

import org.junit.Before;
import org.junit.Test;

import com.jcraft.jsch.ChannelSftp;
import com.techstar.plat.ftp.SftpUtils;

public class TestSftpUtils {

	private static final String host = "10.0.0.166";
	private static final int port = 22; // sftp方式默认端口号是22
	private static final String username = "root";
	private static final String password = "password";
	private static final String directory = "/usr/local/";

	@Before
	public void setUp() throws Exception {
	}

	@Test
	public void connect() {

		/* 测试是否能远程连接linux服务器 */

		ChannelSftp sftp = null;

		try {
			sftp = SftpUtils.getInstance().connect(host, port, username,
					password);

			System.out.println(sftp.isConnected());

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			SftpUtils.getInstance().disconnectSftp(sftp);
		}
	}

	@Test
	public void upload() {

		/* 将本地文件上传到服务器指定的目录下 */

		try {

			String uploadFile = "D:\\shsddata\\SH_20150519_143533_PAS.DT";

			SftpUtils.getInstance().upload(host, port, username, password,
					directory, uploadFile);

			System.out.println("Upload success!");

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@Test
	public void download() {

		try {
			String downloadFile = "SH_SCADA.DT";

			String saveFile = "D:\\shsddata\\SH_SCADA.DT";

			SftpUtils.getInstance().download(host, port, username, password,
					directory, downloadFile, saveFile);

			System.out.println("download '" + downloadFile + "' success!");

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@Test
	public void delete() {
		fail("Not yet implemented");
	}

	@Test
	public void listFiles() {

		/* 列出指定目录下的所有文件及文件夹 */

		try {

			String directory = "/opt/tomcat";

			Vector v = SftpUtils.getInstance().listFiles(host, port, username,
					password, directory);

			if (null != v && !v.isEmpty()) {

				Iterator it = v.iterator();

				while (it.hasNext()) {
					System.out.println(it.next().toString());
				}

			} else {
				System.out.println(directory + " no file");
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private ChannelSftp connectToServer(String host, int port, String username,
			String password) throws Exception {

		ChannelSftp sftp = null;

		try {
			sftp = SftpUtils.getInstance().connect(host, port, username,
					password);

		} catch (Exception e) {
			throw e;
		}

		return sftp;
	}
}

 

IOUtils.java

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
import java.nio.channels.Channel;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class IOUtils {

	private static final Logger log = LoggerFactory.getLogger(IOUtils.class);

	public static void closeChannel(Channel channel) {

		if (null != channel) {
			try {
				channel.close();
			} catch (IOException e) {
				log.error(e.getMessage(), e);
			}
			channel = null;
		}
	}

	public static void closeReader(Reader reader) {

		if (null != reader) {
			try {
				reader.close();
				reader = null;
			} catch (IOException e) {
				log.error("close reader faile!", e);
			}
		}
	}

	public static void closeStream(InputStream is, OutputStream os) {

		if (null != is) {
			try {
				is.close();
				is = null;
			} catch (IOException e) {
				log.error("close InputStream fail!", e);
			}
		}

		if (null != os) {
			try {
				os.close();
				os = null;
			} catch (IOException e) {
				log.error("close OutputStream fail!", e);
			}
		}
	}

	public static void closeWriter(Writer writer) {

		if (null != writer) {
			try {
				writer.close();
			} catch (IOException e) {
				log.error("Close Writer fail:" + e.getMessage(), e);
			}
			writer = null;
		}
	}

	/**
	 * @Title: writeStrToFile
	 * @deprecated: 将字符串写入制定的文件中
	 * @param os
	 *            输出流,包含有用户选择的文件路径
	 * @param str
	 *            字符串
	 * @param fileName
	 *            文件名称
	 * @return int 0:失败, 1:成功
	 * @throws Exception
	 * @author 
	 * @date 2014-11-16
	 */
	public static int writeStrToFile(OutputStream os, String str,
			String fileName) throws Exception {

		log.info("Write String to file,the str is:\r\n" + str);
		log.info("Write String to file,the fileName is:" + fileName);

		int ret = 0;

		OutputStreamWriter writer = null;

		try {

			writer = new OutputStreamWriter(os);

			writer.write(str);

			ret = 1;

		} catch (FileNotFoundException e) {
			log.error("Write String to File fail:" + e.getMessage(), e);
			throw e;
		} catch (IOException e) {
			log.error("Write String to File fail:" + e.getMessage(), e);
			throw e;
		} catch (Exception e) {
			log.error("Write String to File fail:" + e.getMessage(), e);
			throw e;
		} finally {

			try {
				if (null != writer) {
					// 清空缓冲区,否则下一次输出时会重复输出
					writer.flush();

					writer.close();
				}
			} catch (IOException e) {
				log.error("Close OutputStreamWriter fail:" + e.getMessage(), e);
			}

			closeStream(null, os);
		}
		return ret;
	}
}

 

分享到:
评论

相关推荐

    SFTP定时扫描本地文件上传到Linux服务器

    【标题】"SFTP定时扫描本地文件上传到Linux服务器"涉及的关键知识点主要集中在SFTP(Secure File Transfer Protocol)协议的使用、文件系统的监控以及自动化任务的执行。SFTP是一种安全的网络协议,用于在不同主机...

    Linux下的SFTP C语言客户端,包括SFTP下载、上传、list目录和创建目录

    这里,开发者会先创建本地文件的内存映射或读取本地文件,然后使用libssh2_sftp_open_ex()或libssh2_sftp_open()函数在远程服务器上创建或打开文件,再通过libssh2_sftp_write()将数据写入远程文件。 `mkdir.c`文件...

    不需要远程传输文件Linux如何关闭scp和sftp命令.docx

    Linux系统中,scp和sftp命令是两种常用的远程文件传输命令,但是它们也存在一些风险,例如可能会让我们的电脑受到攻击,因此在不需要远程传输文件的时候,我们可以将它们关闭。那么如何禁止scp和sftp命令呢?下面...

    java上传文件到linux服务器,操作linux服务器上文件,下载linux服务器文件,删除linux服务器文件

    本篇文章将深入探讨如何使用Java来实现对Linux服务器的文件上传、操作、下载和删除,以及如何借助ganymed-ssh2库实现远程操作。 首先,让我们了解基础概念。Linux服务器是一种基于Linux操作系统并提供网络服务的...

    SFTP上传下载文件工具

    总之,SFTP上传下载文件工具如FileZilla,对于需要频繁进行远程文件操作的人来说是极其有用的。其强大的功能和易用性使得文件管理变得更加高效和安全。在日常工作中,无论是开发人员部署代码、设计人员分享资源还是...

    sublime text3 远程连接 Linux 系统插件 SFTP

    通过使用SFTP插件,开发者可以无缝地在Sublime Text 3 中处理远程Linux系统的文件,提升了开发过程中的协作效率和便捷性。只需按照插件提供的配置说明进行设置,即可开启这一强大的远程编辑功能。对于经常需要在...

    linux sftp、ftp上传(使用curl)

    在Linux操作系统中,数据传输是日常任务的一部分,无论是文件共享还是备份,SFTP(Secure File Transfer Protocol)和FTP(File Transfer Protocol)都是常用的工具。本文将深入探讨如何使用curl命令来实现在Linux...

    Java运用ganymed-ssh2-build210.jar包远程连接操作linux服务器

    本文档的标题是"Java 运用 Ganymed-SSH2 库远程连接操作 Linux 服务器",这意味着我们将使用 Java 语言来远程连接 Linux 服务器,并使用 Ganymed-SSH2 库来实现远程连接和文件传输。 描述解释 描述部分提到使用 ...

    Java实现Linux的远程拷贝

    通过打开一个SFTP通道,我们可以像操作本地文件系统一样操作远程文件: ```java ChannelSftp sftp = (ChannelSftp) session.openChannel("sftp"); sftp.connect(); sftp.cd("/path/to/remote/directory"); // ...

    windows脚本SFTP上传文件至备份服务器方案

    本方案旨在通过编写Windows批处理脚本,实现对特定文件夹内的文件进行自动归档、压缩,并通过SFTP方式将压缩后的文件上传到远程的Linux备份服务器上。这种方式不仅能够提高数据传输的安全性,还能够减少人工干预,...

    基于QSSH的sftp文件管理器 源代码

    SFTP使用TCP端口22,与SSH服务共享,用户可以通过SFTP客户端连接到服务器,浏览目录,上传、下载文件,以及执行其他文件管理操作。 【Qt】 Qt是一个跨平台的C++图形用户界面应用程序开发框架,由The Qt Company维护...

    windows远程linux工具

    6. **Xming**:对于需要在Windows上运行Linux图形应用程序的用户,Xming是一个轻量级的X Window服务器,可以与SSH结合使用,将远程Linux桌面环境显示在Windows上。 7. **Microsoft Remote Desktop**:虽然主要面向...

    sftp操作实例

    在本文中,我们将深入探讨SFTP的常用操作,包括上传和下载文件。 **1. 安装和配置SFTP客户端** 首先,你需要一个SFTP客户端软件,如`FileZilla`、`WinSCP`或命令行工具`ssh`。在Linux系统中,`ssh`命令通常预装;...

    c#远程控制linux

    标题中的“C#远程控制Linux”指的是利用C#编程语言在Windows环境下开发的软件或工具,用于通过SSH(Secure Shell)协议对远程Linux系统进行控制。SSH是一种安全的网络协议,常用于远程登录、文件传输等操作,尤其...

    Mac下使用SSH连接远程Linux服务器

    本文主要介绍三种方法,在Mac下使用SSH连接远程Linux服务器。 方法一:使用终端 1.打开终端,点击新建远程连接 2.点击加号,然后添加自己服务器的IP地址 3.点击右侧的服务器,然后在下方输入用户名,选择最下方的 ...

    Xftp Linux远程控制文件上传下载工具

    使用了 Xftp 以后,MS Windows 用户能安全地在 UNIX/Linux 和 Windows PC 之间传输文件。Xftp 能同时适应初级用户和高级用户的需要。它采用了标准的 Windows 风格的向导,它简单的界面能与其他 Windows 应用程序紧密...

    linux下FTP、SFTP命令详解.docx

    10. sftp> get 使用当前文件转换类型将远程文件复制到本地计算机。 在 Linux 下,FTP 和 SFTP 命令都是非常重要的网络命令,它们使得用户可以在网络中安全地传输文件。了解这些命令的使用方法,可以帮助用户更好地...

    qt sftp下载,使用Libssh2

    这段代码展示了如何使用Libssh2库连接到SSH服务器,执行身份验证,初始化SFTP会话,打开远程文件,读取文件内容并写入本地文件,最后关闭文件和SFTP会话。请注意,实际应用中需要处理各种可能的错误情况,并进行异常...

    Android实现使用sftp下载linux服务器上的图片文件源码

    在Android平台上,通过SFTP(Secure File Transfer Protocol)与Linux服务器进行交互,实现图片文件的下载,是一项常见的任务。SFTP是一种基于SSH的安全文件传输协议,可以确保数据在传输过程中的安全性和完整性。本...

    linux下FTP、SFTP命令详解

    ### Linux下FTP、SFTP命令详解 ...通过以上的介绍,我们可以了解到在Linux环境下如何使用FTP和SFTP来进行文件传输及管理操作。无论是传统的FTP还是更为安全的SFTP,都是工程师们进行文件管理和共享的重要工具。

Global site tag (gtag.js) - Google Analytics