SFTP 操作Linux远程服务器的文件
SFTP 操作Linux远程服务器的文件
1.列出目录下的文件
2.删除/home/username/test.txt
3.上传文件到Linux 服务器
4.下载Linux 服务器文件到本地
5.下载Linux 服务器文件为byte[]
添加依赖
<properties> <com.jcraft.version>0.1.55</com.jcraft.version> <commons-io.version>2.16.1</commons-io.version> </properties> <dependencies> <dependency> <groupId>com.jcraft</groupId> <artifactId>jsch</artifactId> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> </dependency> </dependencies>
工具类
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.Iterator; import java.util.Properties; import java.util.Vector; import org.apache.commons.io.IOUtils; 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; public class SFTPUtil { private ChannelSftp sftp; // sftp private Session session; // session private String username; private String password; private String privateKey; private String host; private int port; /** * 构造基于密码认证的sftp对象 */ public SFTPUtil(String username, String password, String host, int port) { this.username = username; this.password = password; this.host = host; this.port = port; } /** * 构造基于秘钥认证的sftp对象 */ public SFTPUtil(String username, String host, int port, String privateKey) { this.username = username; this.host = host; this.port = port; this.privateKey = privateKey; } public SFTPUtil() { } /** * 连接sftp服务器, 创建session, sftp channel * * @return */ public void login() { try { JSch jsch = new JSch(); if (privateKey != null) { jsch.addIdentity(privateKey);// 设置私钥 } session = jsch.getSession(username, host, port); // 创建session if (password != null) { session.setPassword(password); } Properties config = new Properties(); config.put("StrictHostKeyChecking", "no"); session.setConfig(config); session.connect(); sftp = (ChannelSftp) session.openChannel("sftp"); sftp.connect(); } catch (JSchException e) { e.printStackTrace(); } } /** * 关闭连接 server, 关闭session, sftp channel */ public void logout() { if (sftp != null) { if (sftp.isConnected()) { sftp.disconnect(); } } if (session != null) { if (session.isConnected()) { session.disconnect(); } } } /** * 列出目录下的文件 * * @param directory 要列出的目录 * @param sftp */ public Vector<?> listFiles(String directory) throws SftpException { return sftp.ls(directory); } /** * 删除文件 * * @param directory 要删除文件所在目录 * @param deleteFile 要删除的文件 */ public void delete(String directory, String deleteFile) throws SftpException { sftp.cd(directory); sftp.rm(deleteFile); } /** * 将输入流的数据上传到sftp作为文件。文件完整路径=basePath+directory * * @param basePath 服务器的基础路径,必须存在 * @param directory 上传到该目录,如果不存在,自动新建 * @param sftpFileName sftp端文件名 * @param in 输入流 */ public void upload(String basePath, String directory, String sftpFileName, InputStream input) throws SftpException { try { sftp.cd(basePath); sftp.cd(directory); } catch (SftpException e) { // 目录不存在,则创建文件夹 String[] dirs = directory.split("/"); String tempPath = basePath; for (String dir : dirs) { if (null == dir || "".equals(dir)) continue; tempPath += "/" + dir; try { sftp.cd(tempPath); } catch (SftpException ex) { sftp.mkdir(tempPath); sftp.cd(tempPath); } } } sftp.put(input, sftpFileName); // 上传文件 } /** * 下载文件。 * * @param directory 下载目录 * @param downloadFile 下载的文件 * @param saveFile 存在本地的路径 */ public void download(String directory, String downloadFile, String saveFile) throws SftpException, FileNotFoundException { if (directory != null && !"".equals(directory)) { sftp.cd(directory); } File file = new File(saveFile); sftp.get(downloadFile, new FileOutputStream(file)); } /** * 下载文件 * * @param directory 下载目录 * @param downloadFile 下载的文件名 * @return 字节数组 */ public byte[] download(String directory, String downloadFile) throws SftpException, IOException { if (directory != null && !"".equals(directory)) { sftp.cd(directory); } InputStream is = sftp.get(downloadFile); byte[] fileData = IOUtils.toByteArray(is); return fileData; } // 测试 public static void main(String[] args) throws Exception { SFTPUtil sftp = new SFTPUtil("username", "password", "ip", 22); //建立连接 sftp.login(); //1.列出目录下的文件 Vector<?> vector = sftp.listFiles("/home/username"); Iterator<?> iterator = vector.iterator(); while (iterator.hasNext()) { ChannelSftp.LsEntry file = (LsEntry) iterator.next(); // 输出文件名字 System.out.println(file.getFilename()); // System.out.println(file.getLongname()); //TODO 可以做其它处理,比如下载 } //2.删除/home/username/test.txt sftp.delete("/home/username","test.txt"); //3.上传文件 File file = new File("C:\\test\\11.txt"); InputStream inputStream = new FileInputStream(file); sftp.upload("/home/username/","testfolder","22.txt", inputStream); //4.下载文件到本地 sftp.download("/home/username", "22.txt", "C:\\test\\22.txt"); //5.下载文件为byte[] } }