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(); } } }