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(Secure File Transfer Protocol)协议的使用、文件系统的监控以及自动化任务的执行。SFTP是一种安全的网络协议,用于在不同主机...
这里,开发者会先创建本地文件的内存映射或读取本地文件,然后使用libssh2_sftp_open_ex()或libssh2_sftp_open()函数在远程服务器上创建或打开文件,再通过libssh2_sftp_write()将数据写入远程文件。 `mkdir.c`文件...
Linux系统中,scp和sftp命令是两种常用的远程文件传输命令,但是它们也存在一些风险,例如可能会让我们的电脑受到攻击,因此在不需要远程传输文件的时候,我们可以将它们关闭。那么如何禁止scp和sftp命令呢?下面...
本篇文章将深入探讨如何使用Java来实现对Linux服务器的文件上传、操作、下载和删除,以及如何借助ganymed-ssh2库实现远程操作。 首先,让我们了解基础概念。Linux服务器是一种基于Linux操作系统并提供网络服务的...
总之,SFTP上传下载文件工具如FileZilla,对于需要频繁进行远程文件操作的人来说是极其有用的。其强大的功能和易用性使得文件管理变得更加高效和安全。在日常工作中,无论是开发人员部署代码、设计人员分享资源还是...
通过使用SFTP插件,开发者可以无缝地在Sublime Text 3 中处理远程Linux系统的文件,提升了开发过程中的协作效率和便捷性。只需按照插件提供的配置说明进行设置,即可开启这一强大的远程编辑功能。对于经常需要在...
在Linux操作系统中,数据传输是日常任务的一部分,无论是文件共享还是备份,SFTP(Secure File Transfer Protocol)和FTP(File Transfer Protocol)都是常用的工具。本文将深入探讨如何使用curl命令来实现在Linux...
本文档的标题是"Java 运用 Ganymed-SSH2 库远程连接操作 Linux 服务器",这意味着我们将使用 Java 语言来远程连接 Linux 服务器,并使用 Ganymed-SSH2 库来实现远程连接和文件传输。 描述解释 描述部分提到使用 ...
通过打开一个SFTP通道,我们可以像操作本地文件系统一样操作远程文件: ```java ChannelSftp sftp = (ChannelSftp) session.openChannel("sftp"); sftp.connect(); sftp.cd("/path/to/remote/directory"); // ...
本方案旨在通过编写Windows批处理脚本,实现对特定文件夹内的文件进行自动归档、压缩,并通过SFTP方式将压缩后的文件上传到远程的Linux备份服务器上。这种方式不仅能够提高数据传输的安全性,还能够减少人工干预,...
SFTP使用TCP端口22,与SSH服务共享,用户可以通过SFTP客户端连接到服务器,浏览目录,上传、下载文件,以及执行其他文件管理操作。 【Qt】 Qt是一个跨平台的C++图形用户界面应用程序开发框架,由The Qt Company维护...
6. **Xming**:对于需要在Windows上运行Linux图形应用程序的用户,Xming是一个轻量级的X Window服务器,可以与SSH结合使用,将远程Linux桌面环境显示在Windows上。 7. **Microsoft Remote Desktop**:虽然主要面向...
在本文中,我们将深入探讨SFTP的常用操作,包括上传和下载文件。 **1. 安装和配置SFTP客户端** 首先,你需要一个SFTP客户端软件,如`FileZilla`、`WinSCP`或命令行工具`ssh`。在Linux系统中,`ssh`命令通常预装;...
标题中的“C#远程控制Linux”指的是利用C#编程语言在Windows环境下开发的软件或工具,用于通过SSH(Secure Shell)协议对远程Linux系统进行控制。SSH是一种安全的网络协议,常用于远程登录、文件传输等操作,尤其...
本文主要介绍三种方法,在Mac下使用SSH连接远程Linux服务器。 方法一:使用终端 1.打开终端,点击新建远程连接 2.点击加号,然后添加自己服务器的IP地址 3.点击右侧的服务器,然后在下方输入用户名,选择最下方的 ...
使用了 Xftp 以后,MS Windows 用户能安全地在 UNIX/Linux 和 Windows PC 之间传输文件。Xftp 能同时适应初级用户和高级用户的需要。它采用了标准的 Windows 风格的向导,它简单的界面能与其他 Windows 应用程序紧密...
10. sftp> get 使用当前文件转换类型将远程文件复制到本地计算机。 在 Linux 下,FTP 和 SFTP 命令都是非常重要的网络命令,它们使得用户可以在网络中安全地传输文件。了解这些命令的使用方法,可以帮助用户更好地...
在Android平台上,通过SFTP(Secure File Transfer Protocol)与Linux服务器进行交互,实现图片文件的下载,是一项常见的任务。SFTP是一种基于SSH的安全文件传输协议,可以确保数据在传输过程中的安全性和完整性。本...
这段代码展示了如何使用Libssh2库连接到SSH服务器,执行身份验证,初始化SFTP会话,打开远程文件,读取文件内容并写入本地文件,最后关闭文件和SFTP会话。请注意,实际应用中需要处理各种可能的错误情况,并进行异常...
### Linux下FTP、SFTP命令详解 ...通过以上的介绍,我们可以了解到在Linux环境下如何使用FTP和SFTP来进行文件传输及管理操作。无论是传统的FTP还是更为安全的SFTP,都是工程师们进行文件管理和共享的重要工具。